見出し画像

( #1 )UnityでタクティスRPGが作りたい!! - タイルを自動生成編 -

どうもみなさん!今回からはタクティスRPG作りたいシリーズを投稿していきたいと思います。この記事を作成した理由は、私のプログラムの成長やゲーム開発のモチベーションとして投稿させていただきます。


まず、タイルの自動生成でしょ!

まず、移動可能なタイルと移動不可能なタイルのプレファブを作成した。
そこに『Tile.cs』を作成し、個々のタイルに必要なデータを書き込んだ。
以下の通り↓

Tile.cs

Tile.cs

英単語とかはあってるかわかりませんw
特に、UNMOVABLEとかw
タイルのデータは作成できたし、いよいよ自動生成システムだ!
TileManagerクラスを作ってそこにシステムを書こう!
以下のようなった

TileManager.cs

using UnityEngine;

public class TileManager : MonoBehaviour
{
    //タイル配列
    [SerializeField] private Tile[] tiles;
    //タイルの親オブジェクト
    [SerializeField] private Transform _tileParent;

    //タイルを格納する2次元配列
    [HideInInspector] public Tile[,] tileDatas;

    //タイルの横幅
    const int WIDTH = 15;
    //タイルの縦幅
    const int HEIGHT = 9;

    private void Start()
    {
        //タイルデータ格納用配列の初期化
        tileDatas = new Tile[WIDTH, HEIGHT];
        for(int i = 0;i < WIDTH; i++)
        {
            for (int j = 0; j < HEIGHT; j++)
            {
                //タイルのスポーン位置を計算
                Vector3Int pos = new Vector3Int(i - WIDTH / 2, j - HEIGHT / 2, 0);

                //タイルをランダムに選択
                Tile SelectTile = GetRandomTile();

                //タイルをスポーン
                var tile = Instantiate(SelectTile, pos, Quaternion.identity, _tileParent);

                //スポーンされたタイルを配列に格納
                tileDatas[i,j] = tile;

            }
        }
    }

    /// <summary>
    /// TYPEからタイルデータを取得
    /// </summary>
    /// <param name="tileType"></param>
    /// <returns></returns>
    public Tile GetTileByType(TILETYPE tileType)
    {
        foreach(Tile tile in tiles)
        {
            if(tile.TileType == tileType) return tile;
        }
        return null;
    }

    /// <summary>
    /// ランダムにタイルを取得
    /// </summary>
    /// <returns></returns>
    private Tile GetRandomTile()
    {
        int rnd = Random.Range(0, 100);

        switch(rnd)
        {
            case < 10:
                return GetTileByType(TILETYPE.UNMOVABLETILE);
            case < 100:
                return GetTileByType(TILETYPE.MOVABLETILE);
        }
        return null;
    }
}

これがベストプラクティスかはわかりませんが、一応動作はします。
こんな感じに↓

GameScreen

青いタイルが移動不可能で、オレンジタイルが移動可能タイルになります。
本当にちゃんとできてますね!
よし今回はこんくらいですね。

いいなと思ったら応援しよう!