次々の卵を生成
卵を無事に巣まで届けたら、ひょこが生まれ、ランダムに歩くようにしましょう。
卵を検知する「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」タグを追加しなければならない。

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

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 で卵のプレハブを設定してください。なお、卵の初期位置を空のゲームオブジェクトで指定してください:


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