![見出し画像](https://assets.st-note.com/production/uploads/images/170652685/rectangle_large_type_2_3d23f11546634ad30d44b35653f2f4ff.png?width=1200)
( #1 )UnityでタクティスRPGが作りたい!! - タイルを自動生成編 -
どうもみなさん!今回からはタクティスRPG作りたいシリーズを投稿していきたいと思います。この記事を作成した理由は、私のプログラムの成長やゲーム開発のモチベーションとして投稿させていただきます。
まず、タイルの自動生成でしょ!
まず、移動可能なタイルと移動不可能なタイルのプレファブを作成した。
そこに『Tile.cs』を作成し、個々のタイルに必要なデータを書き込んだ。
以下の通り↓
Tile.cs
![](https://assets.st-note.com/img/1737213118-NKsUHCBzWJRpQa5ghftIYL09.png)
英単語とかはあってるかわかりません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;
}
}
これがベストプラクティスかはわかりませんが、一応動作はします。
こんな感じに↓
![](https://assets.st-note.com/img/1737213260-XwiF1Ua4GYHs7DBEyKNnx6Wq.png?width=1200)
青いタイルが移動不可能で、オレンジタイルが移動可能タイルになります。
本当にちゃんとできてますね!
よし今回はこんくらいですね。