Skip to main content

次々の卵を生成

卵を無事に巣まで届けたら、ひょこが生まれ、ランダムに歩くようにしましょう。

卵を検知する「EggDetector」

まず、卵が巣に届く検知スクリプトを作成しましょう。卵かどか「Egg」というタグで識別すると:

// 卵を検知する
public class EggDetector : MonoBehaviour
{
    // 検知したら発生するイベント
    public event System.Action<GameObject> Detected;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Egg"))
            Detected?.Invoke(other.gameObject);
    }
}

もちろん、卵に「Egg」タグを追加しなければならない。

image.png

そして、巣にスクリプトをアタッチしてください(すでにトリガー付き)

image.png

次々の卵を生成GameManager で生成

次、ゲームマネージャークラスを作成し、卵が巣に届いたら卵を消し、新しい卵を生成しましょう。まず、ゲームマネージャークラスを作成

スクリプト

public class GameManager : MonoBehaviour
{
    // 卵のプレハブ
    [SerializeField] 
    private GameObject eggPrefab;

    // 卵の開始位置
    [SerializeField] 
    private Transform eggStart;
    
    // 卵のゴール(巣)
    [SerializeField] 
    private EggDetector goal;

    // 新しい卵を生成
    private void CreateEgg()
    {
        // プレハブから卵を生成し、開始位置にする
        var egg = Instantiate(eggPrefab);
        egg.transform.position = eggStart.position;
    }
    
    // 卵が巣に届いたときのイベントを受け取る
    private void OnEggDetected(GameObject egg)
    {
        // 卵を廃止し、次のを生成
        Destroy(egg);
        CreateEgg();
    }
    
    private void Start()
    {
        // 開始の卵を生成
        CreateEgg();

        // イベントに登録
        goal.Detected += OnEggDetected;
    }

    private void OnDestroy()
    {
        // イベント登録解除
        goal.Detected -= OnEggDetected;
    }
}

Unityの設定

今まで使ってきた卵をシーンから削除し、GameManager で卵のプレハブを設定してください。なお、卵の初期位置を空のゲームオブジェクトで指定してください:

image.png

image.png

実行し、確認してください。

Unityの設定卵体力の対応も

すでに作った卵をプレハブにし、シーンから削除してください無事に巣まで届くだけではなく、体力ゼロになった場合でも新しい卵を出しましょう。まず EggHP ではイベントを追加し…

// 卵の体力
public class EggHP : MonoBehaviour
{
    // 卵が割れたときに発生するイベント
    public event System.Action<EggHP> Destroyed; 

    // (省略)

    // 衝突の時
    private void OnCollisionEnter(Collision other)
    {
        // (省略)

        // 体力ゼロ以下の場合、ゲームオブジェクトを廃止し、イベント発生
        if (hp <= 0)
        {
            Destroy(gameObject);
            Destroyed?.Invoke(this);
        }
    }
}

そして、GameManager では:

ひょこプレハブを作成

// 


新しい卵を生成 private void CreateEgg() { // プレハブから卵を生成し、開始位置にする var egg = Instantiate(eggPrefab); egg.transform.position = eggStart.position; // 廃止イベントに登録 EggHP eggHp = egg.GetComponent<EggHP>(); eggHp.Destroyed += OnEggDestroyed; } // 卵が割れたときのイベントを受け取る private void OnEggDestroyed(EggHP eggHp) { // イベント登録解除し、新しいのを生成 eggHp.Destroyed -= OnEggDestroyed; CreateEgg(); } // 卵が巣に届いたときのイベントを受け取る private void OnEggDetected(GameObject egg) { // 廃止イベント登録解除する EggHP eggHp = egg.GetComponent<EggHP>(); eggHp.Destroyed -= OnEggDestroyed; // 卵を廃止し、次のを生成 Destroy(egg); CreateEgg(); }