グリッドベースゲームは、マス目で移動を管理します。
座標管理とタイル情報を理解すれば、様々なゲームが作れます。
この記事では、実装方法を詳しく解説します。
- グリッドシステムの実装
- 座標管理の実装
- タイル情報の管理
- マップ生成の実装
- 実装例とコード

グリッドシステムは、座標管理から始めましょう。整数座標で管理すれば、計算が簡単になります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
グリッドシステムの実装

グリッドシステムは、マス目の管理を担当します。
実装方法を紹介します。
グリッド管理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
using UnityEngine; public class GridSystem : MonoBehaviour { public int gridWidth = 20; public int gridHeight = 20; public float cellSize = 1f; private TileData[,] grid; void Start() { grid = new TileData[gridWidth, gridHeight]; InitializeGrid(); } void InitializeGrid() { for (int x = 0; x < gridWidth; x++) { for (int z = 0; z < gridHeight; z++) { grid[x, z] = new TileData { position = new Vector2Int(x, z), terrainType = TerrainType.Plain }; } } } public Vector3 GetWorldPosition(Vector2Int gridPos) { return new Vector3(gridPos.x * cellSize, 0, gridPos.y * cellSize); } public Vector2Int GetGridPosition(Vector3 worldPos) { return new Vector2Int( Mathf.FloorToInt(worldPos.x / cellSize), Mathf.FloorToInt(worldPos.z / cellSize) ); } public TileData GetTile(Vector2Int gridPos) { if (IsValidPosition(gridPos)) { return grid[gridPos.x, gridPos.y]; } return null; } public bool IsValidPosition(Vector2Int gridPos) { return gridPos.x >= 0 && gridPos.x < gridWidth && gridPos.y >= 0 && gridPos.y < gridHeight; } } [System.Serializable] public class TileData { public Vector2Int position; public TerrainType terrainType; public bool isPassable = true; } |
このコードで、グリッドシステムが実装できます。
グリッド座標とワールド座標の変換ができます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
座標管理の実装

座標管理は、ユニットの位置を管理します。
実装方法を紹介します。
ユニット座標管理システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
public class UnitPositionManager : MonoBehaviour { public GridSystem gridSystem; private Dictionary<Unit, Vector2Int> unitPositions = new Dictionary<Unit, Vector2Int>(); public void PlaceUnit(Unit unit, Vector2Int gridPos) { if (!gridSystem.IsValidPosition(gridPos)) { return; } // 既存の位置をクリア if (unitPositions.ContainsKey(unit)) { Vector2Int oldPos = unitPositions[unit]; gridSystem.GetTile(oldPos).unit = null; } // 新しい位置に配置 unitPositions[unit] = gridPos; gridSystem.GetTile(gridPos).unit = unit; // ワールド座標を更新 unit.transform.position = gridSystem.GetWorldPosition(gridPos); } public Vector2Int GetUnitPosition(Unit unit) { if (unitPositions.ContainsKey(unit)) { return unitPositions[unit]; } return Vector2Int.zero; } public bool CanMoveTo(Unit unit, Vector2Int targetPos) { if (!gridSystem.IsValidPosition(targetPos)) { return false; } TileData tile = gridSystem.GetTile(targetPos); // 通行可能かチェック if (!tile.isPassable) { return false; } // 他のユニットがいるかチェック if (tile.unit != null && tile.unit != unit) { return false; } return true; } } |
このコードで、座標管理が実装できます。
ユニットの位置を管理し、移動可能か判定できます。

座標管理は、グリッド座標で管理しましょう。整数座標で管理すれば、計算が簡単になります。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
タイル情報の管理

タイル情報は、各マスの状態を管理します。
管理方法を紹介します。
タイル情報拡張
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
[System.Serializable] public class ExtendedTileData : TileData { public int moveCost = 1; public float evasionBonus = 0f; public Unit unit = null; public Item item = null; } public class TileInfoManager : MonoBehaviour { public GridSystem gridSystem; public void SetTerrain(Vector2Int gridPos, TerrainType terrainType) { TileData tile = gridSystem.GetTile(gridPos); if (tile != null) { tile.terrainType = terrainType; // 地形に応じて移動コストを設定 ExtendedTileData extendedTile = tile as ExtendedTileData; if (extendedTile != null) { switch (terrainType) { case TerrainType.Plain: extendedTile.moveCost = 1; break; case TerrainType.Forest: extendedTile.moveCost = 2; extendedTile.evasionBonus = 15f; break; case TerrainType.Mountain: extendedTile.moveCost = 3; break; } } } } } |
このコードで、タイル情報が拡張できます。
移動コスト、回避補正などの情報を追加できます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
マップ生成の実装

マップ生成は、ゲームの開始時にマップを作成します。
実装方法を紹介します。
マップ生成システム
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
public class MapGenerator : MonoBehaviour { public GridSystem gridSystem; public GameObject[] tilePrefabs; public void GenerateMap() { for (int x = 0; x < gridSystem.gridWidth; x++) { for (int z = 0; z < gridSystem.gridHeight; z++) { Vector2Int gridPos = new Vector2Int(x, z); TileData tile = gridSystem.GetTile(gridPos); // 地形を決定 TerrainType terrain = DetermineTerrain(x, z); tile.terrainType = terrain; // タイルを配置 Vector3 worldPos = gridSystem.GetWorldPosition(gridPos); GameObject tileObj = Instantiate(tilePrefabs[(int)terrain], worldPos, Quaternion.identity); } } } TerrainType DetermineTerrain(int x, int z) { // 簡単なランダム生成 float random = Random.Range(0f, 1f); if (random < 0.7f) { return TerrainType.Plain; } else if (random < 0.9f) { return TerrainType.Forest; } else { return TerrainType.Mountain; } } } |
このコードで、マップ生成が実装できます。
ランダムに地形を配置して、マップを作成します。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
実装例:完全なグリッドシステム

ここまでで、グリッド管理・座標管理・タイル情報・マップ生成といった個別の仕組みを実装してきました。
ただし、実際のゲームではこれらを単体で使うのではなく、連携させて動かす必要があります。
ここでは、それぞれのシステムをまとめて制御する「完全なグリッドシステム」の実装例を紹介します。
各システムを統合する管理クラス
以下のクラスは、これまで作成した各システムを参照し、ゲーム全体のグリッド処理をまとめて管理します。
マップ生成やユニット移動の入口となるクラスだと考えると理解しやすくなります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using UnityEngine; public class CompleteGridSystem : MonoBehaviour { [Header("システム")] public GridSystem gridSystem; public UnitPositionManager positionManager; public TileInfoManager tileManager; public MapGenerator mapGenerator; void Start() { // マップを生成 mapGenerator.GenerateMap(); } public void MoveUnit(Unit unit, Vector2Int targetPos) { if (positionManager.CanMoveTo(unit, targetPos)) { positionManager.PlaceUnit(unit, targetPos); } } } |
このクラスを用意することで、個別の処理を直接呼び出す必要がなくなり、「ユニットを移動させる」「マップを初期化する」といったゲームの基本操作を、シンプルに管理できます。
ここで行っている処理の役割は、次のように整理できます。
- GridSystem:マス目(グリッド)全体の構造と座標変換を管理する
- UnitPositionManager:ユニットの配置や移動可能判定を担当する
- TileInfoManager:タイルごとの地形や移動コストなどの情報を管理する
- MapGenerator:ゲーム開始時にマップを生成する
TileData・ExtendedTileData・Unitの関係
グリッドベースゲームでは、「マス(タイル)」にどのような情報を持たせるかが重要になります。
ここでは、TileData と ExtendedTileData、そして Unit の関係を整理しておきましょう。
- TileData:各マスの基本情報を持つクラス
(座標・地形タイプ・通行可能かどうかなど) - ExtendedTileData:TileData を拡張したクラス
(移動コスト・回避補正・配置されているユニットやアイテムなど) - Unit:プレイヤーや敵キャラなど、マス上を移動するオブジェクト
この構成にしておくことで、「タイルがどんな地形か」「そのマスに誰がいるか」を一元的に管理でき、マス目移動や判定処理をシンプルに実装できます。
グリッド管理・座標管理・タイル情報・マップ生成を統合することで、実際のゲーム制作にそのまま使える土台が完成します。

このクラスを起点に、攻撃範囲表示やAI処理などを追加していくと、より本格的なゲームに発展させられます。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
よくある質問(FAQ)

Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる
あなたのオリジナルゲーム、今年こそ完成させませんか?
RPG・アクション・ホラー…Unityで本格ゲームを作りたい人のための学習サイトです。
実際に完成するゲームを題材に、
ソースコード・素材・プロジェクト一式をすべて公開。
仕事や学校の合間の1〜2時間でも、
「写経→改造」で自分のゲームまで作りきれる環境です。
まとめ

グリッドシステムは、座標管理から始めましょう。
整数座標で管理すれば、計算が簡単になります。
✅ 今日から始める3ステップ
- ステップ1:グリッドシステムを実装する(所要3時間)
- ステップ2:座標管理を実装する(所要2時間)
- ステップ3:マップ生成を実装する(所要2時間)
本格的にUnityを学びたい方は、Unity入門の森で実践的なスキルを身につけましょう。
あなたのペースで、少しずつ進めていけば大丈夫です。
Unity入門の森を見る 初心者歓迎!動画×プロジェクト一式で本格ゲーム制作を学べる



コメント