未分類

【AIプログラミング検証】3D生態シミュレーション【ChatGPT 4o】

きたたく

プロンプト

あなたはUnityのプロフェッショナルなゲーム開発者です。C#を使用して、シンプルな生態系シミュレーションを作成してください。ゲームは以下の要件を満たす必要があります。

1. 基本要件

  • Unityの3D環境で動作する
  • 生態系のシミュレーションを実装
  • エージェント(動物)*が食料を探し、繁殖し、死ぬ
  • ランダムに配置される環境で、AIが適切な行動をとる
  • このシミュレーションを面白くするユニークな要素を考案・実装

2. 環境

  • フィールド(平面)に、ランダムな位置で食料が生成される
  • 複数の動物(エージェント)がこのフィールド内を移動する

3. AIの行動ルール

  • 移動: ランダムに歩き回るが、食料があるとそちらに向かう
  • 食事: 食料に到達するとエネルギーが回復
  • 繁殖: 一定のエネルギーを持つと、新しい個体を生成
  • 死亡: エネルギーがゼロになると消滅

4. シミュレーションのロジック

  • エージェントは1フレームごとにエネルギーを消費する
  • 食料は時間経過で一定数ランダムに再生成
  • AIの移動はナビゲーションシステムまたはシンプルなランダムウォークを使用
  • 全てのエージェントが死ぬとシミュレーション終了

5. 比較ポイント

このプロジェクトは異なるAIモデルで比較するため、以下の点に注意すること:

  • AIの動きが自然か(エージェントが正しく食料を探せるか)
  • シミュレーションが破綻しないか(すぐに全滅しないか)
  • ゲームが適切に終了するか(エージェントが無限に増え続けないか)
  • コードが明確で分かりやすいか(整理されたオブジェクト指向設計)

6. コード要件

  • C#を使用し、Unityの標準的なコンポーネント(MonoBehaviour、NavMeshなど)を活用する
  • 最低限のUI(エージェント数、食料数のカウンター)を表示
  • パフォーマンスを考慮し、大量のエージェントがいてもFPSが極端に低下しないようにする

7. 出力

完全なUnity C#コードを出力してください。

  • エージェントのスクリプト(Animal.cs)
  • 食料のスクリプト(Food.cs)
  • ゲームマネージャーのスクリプト(GameManager.cs)
  • Unityのセットアップ手順(どのオブジェクトにスクリプトをアタッチするか)

このコードを基に、開発者が簡単にシミュレーションを実行できるようにしてください。

出力

ここに、Unityで生態系シミュレーションを作成するための完全なC#スクリプトを用意しました。
このシミュレーションでは、エージェント(動物)が食料を探し、エネルギー管理を行いながら生存・繁殖・死亡を繰り返します。


セットアップ手順

  1. Unity(3Dプロジェクト)を作成
  2. 「Plane」を作成し、環境を作る
  3. スクリプトを適用するオブジェクトを作成
    • GameManager(空のGameObject)
    • AnimalPrefab(エージェント用のプレハブ)
    • FoodPrefab(食料用のプレハブ)
  4. NavMeshを設定(エージェントの移動用)
    • Planeを選択し、NavigationタブでStaticにチェックを入れ、Bakeをクリック
  5. スクリプトをそれぞれ適用
    • GameManager.csGameManagerオブジェクトにアタッチ
    • Animal.csAnimalPrefabにアタッチ
    • Food.csFoodPrefabにアタッチ

1. GameManager.cs(シミュレーションの管理)

  • エージェントと食料を管理
  • 時間経過で食料をランダム生成
  • シミュレーションの終了判定を行う
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameObject animalPrefab;
    public GameObject foodPrefab;
    public int initialAnimalCount = 10;
    public int foodSpawnRate = 5; // 何秒ごとに食料を生成するか
    public int maxFood = 20;
    public Vector2 fieldSize = new Vector2(20, 20);

    private List<GameObject> animals = new List<GameObject>();
    private List<GameObject> foods = new List<GameObject>();

    void Start()
    {
        // 初期エージェントを生成
        for (int i = 0; i < initialAnimalCount; i++)
        {
            SpawnAnimal();
        }

        // 食料を定期的に生成
        StartCoroutine(SpawnFoodRoutine());
    }

    void Update()
    {
        // エージェントが全滅したらシミュレーション終了
        if (animals.Count == 0)
        {
            Debug.Log("Simulation Ended: All animals have died.");
            StopAllCoroutines();
        }
    }

    void SpawnAnimal()
    {
        Vector3 position = new Vector3(Random.Range(-fieldSize.x, fieldSize.x), 1, Random.Range(-fieldSize.y, fieldSize.y));
        GameObject animal = Instantiate(animalPrefab, position, Quaternion.identity);
        animals.Add(animal);
    }

    IEnumerator SpawnFoodRoutine()
    {
        while (true)
        {
            yield return new WaitForSeconds(foodSpawnRate);
            if (foods.Count < maxFood)
            {
                SpawnFood();
            }
        }
    }

    void SpawnFood()
    {
        Vector3 position = new Vector3(Random.Range(-fieldSize.x, fieldSize.x), 0.5f, Random.Range(-fieldSize.y, fieldSize.y));
        GameObject food = Instantiate(foodPrefab, position, Quaternion.identity);
        foods.Add(food);
    }

    public void RemoveAnimal(GameObject animal)
    {
        animals.Remove(animal);
    }

    public void RemoveFood(GameObject food)
    {
        foods.Remove(food);
    }
}

2. Animal.cs(エージェントの行動AI)

  • 食料を探して移動
  • 食料を食べるとエネルギー回復
  • エネルギーが一定以上で繁殖
  • エネルギーがゼロになると死亡
using System.Collections;
using UnityEngine;
using UnityEngine.AI;

public class Animal : MonoBehaviour
{
    public float energy = 100f;
    public float energyLossRate = 1f;
    public float energyGain = 30f;
    public float reproductionThreshold = 120f;
    public float detectionRange = 10f;

    private NavMeshAgent agent;
    private GameManager gameManager;

    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        gameManager = FindObjectOfType<GameManager>();
        StartCoroutine(BehaviorLoop());
    }

    IEnumerator BehaviorLoop()
    {
        while (energy > 0)
        {
            // 食料を探す
            GameObject food = FindNearestFood();
            if (food != null)
            {
                agent.SetDestination(food.transform.position);
                while (Vector3.Distance(transform.position, food.transform.position) > 1f)
                {
                    energy -= energyLossRate * Time.deltaTime;
                    yield return null;
                }
                EatFood(food);
            }
            else
            {
                // ランダム移動
                Vector3 randomPosition = new Vector3(Random.Range(-10, 10), 1, Random.Range(-10, 10));
                agent.SetDestination(randomPosition);
                yield return new WaitForSeconds(3);
            }

            // 繁殖チェック
            if (energy >= reproductionThreshold)
            {
                Reproduce();
            }

            // 死亡チェック
            if (energy <= 0)
            {
                Die();
            }
        }
    }

    GameObject FindNearestFood()
    {
        GameObject[] foods = GameObject.FindGameObjectsWithTag("Food");
        GameObject nearestFood = null;
        float minDistance = detectionRange;

        foreach (GameObject food in foods)
        {
            float distance = Vector3.Distance(transform.position, food.transform.position);
            if (distance < minDistance)
            {
                minDistance = distance;
                nearestFood = food;
            }
        }

        return nearestFood;
    }

    void EatFood(GameObject food)
    {
        energy += energyGain;
        gameManager.RemoveFood(food);
        Destroy(food);
    }

    void Reproduce()
    {
        energy /= 2; // 親のエネルギーを半分にする
        gameManager.SendMessage("SpawnAnimal");
    }

    void Die()
    {
        gameManager.RemoveAnimal(gameObject);
        Destroy(gameObject);
    }
}

3. Food.cs(食料の管理)

  • 食料が食べられると削除される
using UnityEngine;

public class Food : MonoBehaviour
{
    void Start()
    {
        gameObject.tag = "Food";
    }
}

まとめ

  • GameManager.csゲームの進行管理
  • Animal.csエージェントのAI(移動・食事・繁殖・死亡)
  • Food.cs食料の管理
  • NavMeshを利用して、リアルな移動を実装
  • 時間経過で食料を再生成し、エコシステムを維持

このコードをUnityに適用すれば、シンプルな生態系シミュレーションが動作します。
エージェントは食料を探して動き回り、エネルギー管理をしながら生き延びるようになります。

このシステムを拡張するには?

  • 異なる動物タイプ(肉食・草食)を追加
  • より高度なAI(学習・進化)を導入
  • シミュレーションデータを可視化

このコードをベースに、面白いシミュレーションを作ってみてください!🚀

ABOUT ME
きたたく
きたたく
学習工学博士
自由に生きる人を増やしたい大学教員・経営者。
生成AIで経済的自由を達成するための知識を発信中。
元不登校から飛び級で博士号(工学)を取得した連続起業家。
プログラミングを通じて「U-22 プログラミングコンテスト CSAJ 会長賞」「IoT Challenge Award 総務大臣賞」「人工知能学会研究会 優秀賞」など40件を超える賞を受賞。
スマホアプリ会社を創業(売却)し、プログラミングスクールの会社を創業(20店舗経営)

著書:知識ゼロからのプログラミング学習術(秀和システム) 他多数
記事URLをコピーしました