前回までで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だ!
////////////////////////////////////////
ー広告ー