# 次々の卵を生成

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

## 卵を検知する「EggDetector」

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

```c#
// 卵を検知する
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](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/WY3image.png)

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

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/8Mrimage.png)

## GameManager で生成

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

### スクリプト

```c#
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](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/YnNimage.png)

![image.png](https://class.illogic.games/uploads/images/gallery/2026-07/scaled-1680-/92Ximage.png)

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

### 卵体力の対応も

無事に巣まで届くだけではなく、体力ゼロになった場合でも新しい卵を出しましょう。まず EggHP ではイベントを追加し…

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

    // (省略)

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

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

そして、GameManager では：

```c#
// 新しい卵を生成
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();
}
```