(Unity)ステージのランダム自動生成(テキストファイル&多次元配列の活用)

(スクリプト)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AutoMakeStage : MonoBehaviour
{
    public TextAsset[] stageFile;

    private string[] stageData;
    private string[,] stageMap;

    private int tateNum;
    private int yokoNum;

    public GameObject enemyGenePrefab;
    public GameObject towerPrefab;
    public GameObject setBotPrefab;
    public GameObject rightPrefab;
    public GameObject leftPrefab;

    void Start()
    {
        // ステージのランダム化(テクニック)
        int num = Random.Range(0, stageFile.Length);

        string stageLines = stageFile[num].text;
        print(stageLines);

        // 改行でデータを分割して配列に代入
        stageData = stageLines.Split('\n');

        // 行数と列数の取得
        yokoNum = stageData[0].Split(',').Length;
        tateNum = stageData.Length;

        print("yoko: " + yokoNum);
        print("tate: " + tateNum);

        // 多次元配列の定義
        stageMap = new string[tateNum, yokoNum];

        for (int i = 0; i < tateNum; i++)
        {
            string[] tempWords = stageData[i].Split(',');

            for (int j = 0; j < yokoNum; j++)
            {
                stageMap[i, j] = tempWords[j];

                if (stageMap[i, j] != null)
                {
                    switch (stageMap[i, j]) // ★データは「左上」から順番に並んでいる(ポイント)
                    {
                        case "G": // 「j」は「横」ナンバー・・・>「X」に対応。「i」は「縦」ナンバー・・・>「Z」に対応。
                            Instantiate(enemyGenePrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.identity);
                            break;

                        case "T":
                            Instantiate(towerPrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.identity);
                            break;

                        case "S":
                            Instantiate(setBotPrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.identity);
                            break;

                        case "R":
                            Instantiate(rightPrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.identity);
                            break;

                        case "L":
                            Instantiate(leftPrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.identity);
                            break;

                        case "G2":
                            // Geneを横方向にする。(向きを変える)
                            Instantiate(enemyGenePrefab, new Vector3(-8f + j * 2, 1f, 8f - i * 2), Quaternion.Euler(0, 90, 0));
                            break;
                    }
                }
            }
        }
    }
}

(設定)


(実行結果)

<ステージ1>

<ステージ2>

<ステージ3>