前回の記事はこちら
今回はマップ(といってもアイテムを配置するだけだけど)を作っていきます。
与えられたCSVファイルを元にアイテムとジェネレータを設置していきます。
どんなCSVにするか
今回は下のようなルールに従ったCSVファイルを使います。(変更あるかもしれません)
作るものによって変えてください。
・縦の長さと横の長さが等しい(5x5 8x8みたいなことです)
・整数のみで構成される
・-3はGenerator2を配置
・-2はGenerator1を配置
・-1は何も配置しない
・0はOffensivePowerItemを配置
・1はDamageItemを配置
準備
まず次のようなCSVファイルを作ってみます。
警告
CSVファイルなのでTSV形式やXLSX形式では作らないでください。
-1 | 0 | -1 | -1 | -2 |
-1 | 0 | 1 | -1 | -1 |
-1 | 0 | -1 | 0 | -1 |
-1 | -1 | 1 | 0 | -1 |
-3 | -1 | -1 | 0 | -1 |
テキストエディタから作る場合
-1, 0, -1, -1, -2
-1, 0, 1, -1, -1
-1, 0, -1, 0, -1
-1, -1, 1, 0, -1
-3, -1, -1, 0, -1
CSVファイルを作ったら、UnityのProjectのAssetsのResourcesフォルダに移動してください。
Resourcesフォルダがなかったら作ってください。
CSVを読み込む
まず、CSVを読み込んで二次元配列(今回使うのは厳密にはジャグ配列ですが)にします。
そのコードがこちらです。
csvFile = Resources.Load("CodeFightMap1") as TextAsset;
StringReader reader = new StringReader(csvFile.text);
List<int[]> csvDatas = new List<int[]>(); //ジャグ配列にする前のリスト
while(reader.Peek() > -1)
{
string line = reader.ReadLine();
csvDatas.Add(line.Split(",").Select(s => int.Parse(s)).ToArray()); //この書き方を知らない人は"Linq"で検索してください。
}
int[][] csvDatasArray = csvDatas.ToArray(); //ジャグ配列
二次元配列をもとに配置をする
下のようなプログラムで配置できます。
//マップの中心を表す。自由に変えてください。
Vector3 centerPosition = new Vector3(-3.048042f, 0, 0);
//マップの大きさに応じて変える。自由に変えてください。
float fieldSize = 1f;
for(int j = 0; j < csvDatas.Count; j++)
{
for(int i = 0; i < csvDatas[0].Length; i++)
{
// アイテムなどを置くいちを計算
Vector3 itemOrGeneratorPosition = new Vector3(i - (float)(csvDatas[0].Length - 1) / 2, -j + (float)(csvDatas.Count - 1) / 2, 0) * fieldSize + centerPosition;
//ここからは自由に変更してください。
if (photonView.IsMine) //オンラインゲームじゃない場合は全く必要ない
{
if (csvDatasArray[j][i] == 0)
{
PhotonNetwork.Instantiate(OffensivePowerItem.name, itemOrGeneratorPosition, Quaternion.identity);
}
else if (csvDatasArray[j][i] == 1)
{
PhotonNetwork.Instantiate(DamageItem.name, itemOrGeneratorPosition, Quaternion.identity);
}
}
if (csvDatasArray[j][i] == -2 && photonView.IsMine)
{
Instantiate(generator1, itemOrGeneratorPosition, Quaternion.identitya);
}
if (csvDatasArray[j][i] == -3 && !photonView.IsMine)
{
Instantiate(generator2, itemOrGeneratorPosition, Quaternion.identity);
}
}
}
仕上げ
次のようなコルーチンをOnlineManager.csの中のOnlineManagerクラスの中に作ります。
private IEnumerator generateMap()
{
yield return new WaitForSeconds(1f);
csvFile = Resources.Load("CodeFightMap1") as TextAsset;
StringReader reader = new StringReader(csvFile.text);
List<int[]> csvDatas = new List<int[]>();
while(reader.Peek() > -1)
{
string line = reader.ReadLine();
csvDatas.Add(line.Split(",").Select(s => int.Parse(s)).ToArray());
}
int[][] csvDatasArray = csvDatas.ToArray();
Vector3 centerPosition = new Vector3(-3.048042f, 0, 0);
float fieldSize = 1f;
for(int j = 0; j < csvDatas.Count; j++)
{
for(int i = 0; i < csvDatas[0].Length; i++)
{
Vector3 itemOrGeneratorPosition = new Vector3(i - (float)(csvDatas[0].Length - 1) / 2, -j + (float)(csvDatas.Count - 1) / 2, 0) * fieldSize + centerPosition;
if (photonView.IsMine)
{
if (csvDatasArray[j][i] == 0)
{
PhotonNetwork.Instantiate(OffensivePowerItem.name, itemOrGeneratorPosition, Quaternion.identity);
}
else if (csvDatasArray[j][i] == 1)
{
PhotonNetwork.Instantiate(DamageItem.name, itemOrGeneratorPosition, Quaternion.identity);
}
}
if (csvDatasArray[j][i] == -2 && photonView.IsMine)
{
Instantiate(generator1, itemOrGeneratorPosition, Quaternion.identity);
}
if (csvDatasArray[j][i] == -3 && !photonView.IsMine)
{
Instantiate(generator2, itemOrGeneratorPosition, Quaternion.identity);
}
}
}
}
最後にStartメソッドの最後に次のプログラムを追加してください。
StartCoroutine("generateMap");
これでスタートした直後にマップが生成されるようになります。
次回は、マップエディタを作ります。
次回の記事はこちら