次々の卵を生成

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

卵を検知する「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

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

卵体力の対応も

無事に巣まで届くだけではなく、体力ゼロになった場合でも新しい卵を出しましょう。まず 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();
}

Revision #4
Created 2026-07-23 07:59:56 UTC by Menendez Francisco
Updated 2026-07-24 04:35:29 UTC by Menendez Francisco