LoginSignup
0
1

Unityでのゲーム作り日記#14 ~アイテムを配置する~

Last updated at Posted at 2024-02-26

前回の記事はこちら
今回はマップ(といってもアイテムを配置するだけだけど)を作っていきます。
与えられた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");

これでスタートした直後にマップが生成されるようになります。

次回は、マップエディタを作ります。
次回の記事はこちら

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1