PrefabとUniBulletHellとDoTween

 

プレハブで使用したい小技

 

インスペクターで取得するオブジェクトをプログラムで行う

 

元のソース

[Header("プレイヤー")] public GameObject target;

 

ここにplayerをアタッチして、targetとしてました。

 

しかし、プレハブ化すると、毎回playerのアタッチをする羽目になり、面倒くさい。

 

そこで、プログラムでこの作業を簡略化。

 

解決策

private GameObject target;

 

void Start( )
{
 target = GameObject.Find("player");
}

 

としました。
これで、毎回アタッチする必要がなくなりました。

 

インスペクターで取得する関数をclass操作で行う

 

元のソース

 

例えば、敵がプレイヤーの死亡を確認したい時

 

[Header("生死を確認できるオブジェクト")] public Player pDeath;

 

とし、インスペクターでPlayerをアタッチします。
プレハブから実態化した時、毎回Playerをアタッチする必要があります。

 

解決策

敵がプレイヤーと敵のボスの状態をスプリクトで取得する例です。

 

Playerのスプリクト
public class player : MonoBehaviour
{
   //関数
   public string Hello()
   {
     string text = "死んでしまった";
     return text; //返り値を宣言する
   }
}

 

Bossのスプリクト
public class enemyBoss : MonoBehaviour
{
   //関数
   public string Boss()
   {
     string text = "われは強い";
     return text; //返り値を宣言する
   }
}

 

敵のスプリクト
プレイヤーとBossの状態を確認

 

using static player; //使用するクラスを宣言します。
using static enemyBoss;

 

public class enemy : MonoBehaviour
{
  player teta = new player(); //プレイヤーを取得
  enemyBoss boss = new enemyBoss(); //Bossを取得

 

private void Start() //今回はStart( )を使用しました。
{
  string hello = teta.Hello();
  string boss = boss.Boss();

 

  if (hello == "死んでしまった")
  {
    //処理を書く
  }

 

  if(boss == "われは強い")
  {
    //処理を書く
  }
}

 

注意: プレハブ化すると【You are trying to create a MonoBehaviour using the 'new' keyword.This is not allowed. MonoBehaviours can only be added using AddComponent().
Alternatively, your script can inherit from ScriptableObject or no base class at
all】の注意が出る

 

直訳→'new'キーワードを使用してMonoBehaviourを作成しようとしています。これは許可されていません。MonoBehavioursは、AddComponent()を使用してのみ追加できます。または、スクリプトはScriptableObjectから継承することも、基本クラスをまったく継承しないこともできます。

 

対応策がまだ分かっていませんが、たぶんGridが入るとダメっぽいです。
上記のプログラムでは異常はありませんでした。

 

敵(プレハブ)を自動生成する

空のオブジェクトを作成する。
名前は適当にenemyOccとする。

 

public class enemyOcc : MonoBehaviour
{
  public GameObject enemyPrefab;

 

  void Start( )
  {
    //繰り返し生成する
    InvokeRepeating("Spawn", 2f, 0.5f) ; //2秒後に0.5秒間隔で生成する

 

  void Spawn( ) //生成する
  {
    Instantiate(enemyPrefab,     //生成するオブジェクト
           transform.position,  //enemyOccの位置で生成する
           transform.rotation //生成する時の向き
           );
  }
}

 

敵(プレハブ)する位置をX座標でランダムに生成する

上記の関数Spawn( )を
  void Spawn( ) //生成する
  {
    //生成する位置をランダムに変える
    Vectet3 spawnPosition = new Vector3(
       Random.Range(-3.0f, 2.5f), //X軸座標-3~2.5の間で
       transform.position.y, //Y軸座標はそのまま
       transform.position.z //Z軸座標はそのまま
       );

 

    Instantiate(enemyPrefab,   //生成するオブジェクト
           spawnPosition,  //X軸ランダムに
           transform.rotation //生成する時の向き
           );
  }

UniBulletHellの使い方

 

UniBulletHellの弾の発射Sprict

UniBulletHellは、シューティングなどで使用する弾幕を簡単に作れるアセットです。

 

しかし、初歩的な弾幕の出し方が分かりませんでした。
あまりにも初歩的だったようで、解説している方を見つけられませんでした。
そこで、忘れてしまっても、すぐに思い出すようにまとめてみました。

 

オブジェクトの配置

 

▼Player (画像あり)
 ▼GameObjedt (画像なしで、Shot Controllerをあてる)
  ■CircleShot (好みの弾幕パターン)

 

スプリクト

 

public class player : MonoBehaviour
{
  public UbhShotCtrl usc;

 

 void Update()
 {
   if (・・・)
   {
     usc.StartShotRoutine();
   }
 }
}

 

解説
UbhShotCtrlは、Add ComponentでGameObjedtにShotControllerを、追加した時につくスプリクトclassです。
そのclassをuscとしました。
usc.StartShotRoutine();を入れると、弾幕開始します。
if文で条件を付けるといいですね。

 

停止は、usc.StopShotRoutine();になります。

 

スタートの( )には1f等と遅延時間を入れます。
ストップでは遅延時間は使用できません。

 

生成した弾幕を時間で削除していく

 

答えは、弾自体に時間制限をつけます。
弾の場所は、UniBulletHell >Example >Prefab >Otherにあります。

 

使用している弾のスプリクトを開きます。
例えば、弾がEnemyBulletParentの場合、スプリクトはUbh Bullet Simple Sprite 2dと表示されています。
このUbh Bullet Simple Sprite 2dを開きます。

 

追加する機能は、削除する時間 : lifeTimeです。

 

スプリクト上部の変数設定の場所に、
[Header("弾の寿命")] public float lifeTime;と追加します。

 

次に、
private void Start( )
{
Destroy(gameObject, ilfeTime); //時間でこのオブジェクトを削除する
}
を記入します。

 

これで、弾が生成されてから、指定した時間で消えていきます。

 

弾幕に当たり判定を付ける

 

使用している弾に新なスプリクトを追加します。

 

1.使用している弾にCollider2D(例えばCircle Collider)を付けます。
2.Rigidbody2Dを付け、BodyTypeをKinematicにします。
 Kinematicは弾かれるとか、重力で落ちるとかの外部から影響をうけません。

 

当たり判定

public classBulletTama : MonoBehaviour
{
 //弾が当たってplayerの減算処理をする場合
 [Header("減算ない")] public bool non;
 [Header("減算スコア")] public int subScore;

 

 private string playerTag = "player"; //プレイヤーを認識するためのタグ
 private bool isHit = false; //弾が当たっていない

 

 void Update()
 {
   if (!non) //スコアの減算処理をする場合
   {
      if (isHit) //弾が当たったら
      {
         Destroy(gameObject); //弾を削除

 

         //HPの減算
         if (GManager.instance != null) //GManagerというスコア管理しているClass
         {
            GManager.instance.score -= subScore; //スコアを減算
         }
      }
   }
 }

 

 void OnCollisionEnter2D(Collision2D collision) //物体が衝突した時に呼ばれる。衝突データを取得します。
 {
   if (collision.collider.tag == playerTag) //当たった相手のタグを確認し一致していたら
   {
      isHit = true; //弾が当たった
   }
   else //タグが合わない場合には
   {
      isHit = false; //当たっていしない
   }
 }
}

このページの先頭へ戻る