Cou氏の徒然日記(2022)

ほのぼの日記ブログです。

Unityで遊ぼう その8 (ステージを自動生成)

coublood.hatenablog.com

 

あるフロアの中に障害物を作るのはいいんですが、これを色々と壁や穴を作るとなるとかなり大変。特に穴なんて開けるのは…。

…でれば、そもそも全体のフロアを作って、その上に壁を作ったりするのではなく、小さいフロアのパーツを何パターンか作ってしまい、それを配置する方向にすればいいんじゃない?とふと思いました。

 

…ということで、適当にパーツを作成。

■ Floor1 (ただの平面)

f:id:coublood:20200502072207p:plain

■ Floor2 (真ん中に大きなCube)

f:id:coublood:20200502072217p:plain

■ Floor3 (真ん中に45度回転のCube)

f:id:coublood:20200502072228p:plain

あとは、それを初期化時に配置するように定義。

    public GameObject StartFloorPrefab;
    public GameObject EndFloorPrefab;
    public GameObject Floor1Prefab;
    public GameObject Floor2Prefab;
    public GameObject Floor3Prefab;

    // Start is called before the first frame update
    void Start()
    {
        // STARTとENDの床を配置 //
        GameObject startFloor = GameObject.Instantiate(StartFloorPrefab);
        GameObject endFloor= GameObject.Instantiate(EndFloorPrefab);

        for (int i = 0; i < 50; i++)
        {
            // Floor1をランダムな場所に配置する //
            GameObject randomFloor1 = Instantiate(Floor1Prefab);
            randomFloor1.transform.position = new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
        }
        for (int i = 0; i < 10; i++)
        {
            // Floor2をランダムな場所に配置する //
            GameObject randomFloor2 = Instantiate(Floor2Prefab);
            randomFloor2.transform.position = new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
        }
        for (int i = 0; i < 10; i++)
        {
            // Floor3をランダムな場所に配置する //
            GameObject randomFloor3 = Instantiate(Floor3Prefab);
            randomFloor3.transform.position = new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
        }
    }

適当な部品しか作っていないので、大したステージにはなりませんが、まあいい感じになりました。

f:id:coublood:20200502073107p:plain

部品のパターンを増やしたり、パーツによってその範囲に配置するかなどを組み合わせたりすることで、もっといろいろとできそうですね。