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