UnityでCSVファイルを読み込んでマップ作製2

前回まででCSVファイルのマップデータをUnityで
読み込むことができました。
今回は読み込んだデータからオブジェクトを
配置していきたいと思います。

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

public class MapMaker : MonoBehaviour {

    public GameObject MapObject;    //石のPrefabを入れる箱をGameObject型変数で宣言
    public GameObject TreeObject;   //木のPrefabを入れる箱をGameObject型変数で宣言

    public GameObject MapPut;     //石オブジェクトを配置するのに使う
    public GameObject TreePut;    //木オブジェクトを配置するのに使う

    public TextAsset csvFile; // CSVファイル読み込むのに使う

    string str = "";        //CSVの全文字列を保存する
    string strget = "";     //取り出した文字列を保存する

    int gyou = 10;  //CSVデータの行数
    int retu = 10;  //CSVデータの列数

    int[,] map = new int[20, 20];   //マップ番号を格納するマップ用変数
    int[] iDat = new int[15];       //文字検索用

    int a = 0;    //濫用 数値型変数
    int b = 0;    //濫用 数値型変数
    int c = 0;    //濫用 数値型変数

    int ix = 0;     //マップ置くX座標 初期位置
    int iy = 0;     //マップ置くY座標 初期位置
    int iz = 0;     //マップ置くZ座標 初期位置

    // Use this for initialization
    void Start () {

  //----------↓ ここでCSVデータをstrに保存 ↓
        csvFile = Resources.Load("testmap2") as TextAsset;
        StringReader reader = new StringReader(csvFile.text);

        while (reader.Peek() > -1)
        {
            string line = reader.ReadLine();
            str = str +","+ line;
        }

        str = str + ",";        //最後に検索文字列の","を追記。これがないと最後の文字を取りこぼす。
  //----------↑ ここでCSVデータをstrに保存 ↑

  //----------↓ ここでCSVデータをマップ配列変数mapに保存 ↓
        for (int c = 0; c < gyou; c++)
        {
            for (int i = 0; i < retu; i++)
            {
                try
                {
                    iDat[0] = str.IndexOf(",", iDat[0]);   //","を検索
                }
                catch { break; }

                try
                {
                    iDat[1] = str.IndexOf(",", iDat[0] + 1);   //次の","を検索
                }
                catch { break; }

                iDat[2] = iDat[1] - iDat[0] - 1;                //何文字取り出すか決定

                try
                {
                    strget = str.Substring(iDat[0] + 1, iDat[2]);   //iDat[2]文字ぶんだけ取り出す
                }
                catch { break; }

                try
                {
                    iDat[3] = int.Parse(strget);        //取り出した文字列を数値型に変換
                }
                catch { break; }

                map[a, b] = iDat[3];                    //マップ用変数に保存。1とか6とか数字が入るよ
                b++;                            //一つ右のマップ用変数へ
                iDat[0]++;                      //次のインデックスへ
            }

            a++;                                //一つ下のマップチップへ
            b = 0;                              //マップチップ格納を一番左に戻す。
        }

  //----------↑ ここでCSVデータをマップ配列変数mapに保存 ↑

  //----------↓ ここでマップ配列変数mapの内容を確認できます ↓
        //a = 0;
        //for (int c = 0; c < gyou; c++)
        //{
        //    for (int i = 0; i < retu; i++)
        //    {
        //        Debug.Log("map." +a+"."+ i + ": " + map[a, i]);
        //    }
        //    a++;
        //}
  //----------↑ ここでマップ配列変数mapの内容を確認できます ↑

  //----------↓ ここでマップ配列変数mapからオブジェクトを配置 ↓

        ix = -10;   //マップ置くX座標 初期位置
        iy = 0;     //マップ置くY座標 初期位置
        iz = 100;   //マップ置くZ座標 初期位置

        a = 0;
        b = 0;
        c = 0;

        for (int c = 0; c < gyou; c++)
        {

            for (int i = 0; i < retu; i++)
            {
                if (map[a, b] == 1)     //マップ番号が1なら木を配置
                {
                    TreePut = Instantiate(TreeObject) as GameObject;   //Instantiate関数でTreePreのコピーを作る。
                    TreePut.transform.position = new Vector3(ix, iy, iz);
                }

                if (map[a, b] == 2)     //2なら石を地面に配置
                {
                    MapPut = Instantiate(MapObject) as GameObject;   //Instantiate関数でCubePreのコピーを作る。
                    MapPut.transform.position = new Vector3(ix, iy+3, iz);
                }

                if (map[a, b] == 3)     //3なら石を高めに配置してダンジョンの屋根にする
                {
                    MapPut = Instantiate(MapObject) as GameObject;   //Instantiate関数でCubePreのコピーを作る。
                    MapPut.transform.position = new Vector3(ix, iy + 8, iz);
                }

                b++;            //次の右のマップ番号を読み込む
                ix = ix + 5;    //配置位置を右に移動
            }

            a++;            //一行終了。下の段のマップ番号を読み込んでいく
            b = 0;          //行の始めに戻るからb=0
            iz = iz - 5;    //下の段に配置していくからZ座標をー5する
            ix = -10;       //一段下の左端からまた配置していくからX座標は初期位置になる
        }

    }
	
	// Update is called once per frame
	void Update () {
		
	}
}

長々とした美しくないコードができてしまったよ。
もっとスマートなやり方があると思います。

実行結果↓

まあまあ思ってた感じに配置できているような
気がしますな。
石の高さが低いので遺跡の中には入れないけど
高さを調整したら入れそう。

なんか例外エラーが出てたので
try~catchいうのを初めて使いました。
何事も挑戦だ! 失敗したらcatchでbreakだ!

////////////////////////////////////////
ー広告ー



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です