ゲームで、毎回違うマップを自動生成したい。
手動でマップを作るのではなく、アルゴリズムで生成したい。
そんな場面で使えるのが、マップ自動生成です。
マップ自動生成は、プロシージャル生成に使う数学的アルゴリズムです。
これを使うことで、様々なマップを自動的に生成できます。
この記事では、マップ自動生成のアルゴリズムとして、プロシージャル生成に使う数学を見ていきましょう。
- マップ自動生成のアルゴリズムが分からない…
- プロシージャル生成でマップを作りたい。
- 自動生成の方法を知りたい。
✨ この記事でわかること
- マップ自動生成の基本概念
- プロシージャル生成に使う数学
- ノイズ関数を使った生成
- Unityでの実装方法
- 初心者でも理解できる自動生成の考え方
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます
マップ自動生成とは何か(ゲーム制作目線)

マップ自動生成は、アルゴリズムを使って、自動的にマップを生成する技術です。
手動でマップを作るのではなく、数学的なアルゴリズムでマップを生成します。
これにより、毎回違うマップを生成したり、大きなマップを効率的に生成したりできます。
マップ自動生成には、ノイズ関数、セルオートマトン、ダイアモンドスクエアアルゴリズムなど、様々な手法があります。
ゲーム開発では、ローグライクゲーム、オープンワールドゲームなど、様々なジャンルで使われます。
ゲームでの具体的な使い道

マップ自動生成が、ゲームでどう使われているか確認してみましょう。
ローグライクゲーム
マップ自動生成を使って、毎回違うダンジョンを生成します。
ノイズ関数やセルオートマトンを使って、ランダムなマップを生成できます。
オープンワールドゲーム
マップ自動生成を使って、大きなワールドを生成します。
必要な部分だけを生成すれば、効率的に大きなマップを扱えます。
地形生成
マップ自動生成を使って、自然な地形を生成します。
パーリンノイズなどを使って、起伏のある自然な地形を生成できます。
ダンジョン生成
マップ自動生成を使って、ダンジョンを生成します。
部屋と通路を自動的に配置すれば、プレイ可能なダンジョンを生成できます。
- ローグライクゲーム(毎回違うダンジョン)
- オープンワールドゲーム(大きなワールド)
- 地形生成(自然な地形)
- ダンジョン生成(部屋と通路の配置)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

マップ自動生成は、数学的なアルゴリズムでマップを生成します。
ノイズ関数を使った生成
ノイズ関数を使って、ランダムな値を生成します。
この値を使って、地形の高さや、マップの配置を決定します。
セルオートマトン
セルオートマトンを使って、マップの配置を生成します。
周囲のセルの状態に基づいて、各セルの状態を決定します。
部屋と通路の生成
部屋を配置し、通路でつなげる方法でダンジョンを生成します。
部屋の位置とサイズをランダムに決定し、最短経路でつなげます。
レイヤー化された生成
複数のレイヤーを組み合わせて、マップを生成します。
例えば、地形レイヤー、植生レイヤー、建造物レイヤーなどを組み合わせます。
- マップ自動生成は、数学的なアルゴリズムでマップを生成する
- ノイズ関数、セルオートマトン、ダイアモンドスクエアなど、様々な手法がある
- 複数のレイヤーを組み合わせることで、より複雑なマップを生成できる
- 必要な部分だけを生成すれば、効率的に大きなマップを扱える
Unityで実装する際の注意点(代表例)

Unityでマップ自動生成を実装する場合の注意点を見ていきましょう。
ノイズ関数を使った地形生成
パーリンノイズを使って、地形の高さを生成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class TerrainGenerator : MonoBehaviour { public float scale = 0.1f; public float height = 10f; void GenerateTerrain() { for (int x = 0; x < width; x++) { for (int z = 0; z < depth; z++) { // パーリンノイズで高さを生成 float noiseValue = Mathf.PerlinNoise(x * scale, z * scale); float terrainHeight = noiseValue * height; // 地形の高さを設定 terrainData.SetHeight(x, z, terrainHeight); } } } } |
セルオートマトンを使ったダンジョン生成
セルオートマトンを使って、ダンジョンを生成します。
|
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 |
public class DungeonGenerator : MonoBehaviour { private bool[,] map; void GenerateDungeon() { // 初期状態をランダムに設定 for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { map[x, y] = Random.value < 0.45f; } } // セルオートマトンのルールを適用 for (int i = 0; i < iterations; i++) { SmoothMap(); } } void SmoothMap() { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { int neighborCount = GetNeighborCount(x, y); if (neighborCount > 4) map[x, y] = true; else if (neighborCount < 4) map[x, y] = false; } } } } |
部屋と通路の生成
部屋を配置し、通路でつなげる方法でダンジョンを生成します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class RoomBasedDungeon : MonoBehaviour { public List<Room> rooms = new List<Room>(); void GenerateDungeon() { // 部屋を配置 for (int i = 0; i < roomCount; i++) { Room room = CreateRandomRoom(); if (!Overlaps(room)) { rooms.Add(room); } } // 通路でつなげる for (int i = 1; i < rooms.Count; i++) { CreateCorridor(rooms[i - 1], rooms[i]); } } } |
実装のコツ
シード値を設定すれば、再現可能なマップを生成できます。
必要な部分だけを生成すれば、効率的に大きなマップを扱えます。
複数のレイヤーを組み合わせることで、より複雑なマップを生成できます。

まとめ

この記事では、マップ自動生成のアルゴリズムについて見てきました。
重要なポイントをおさらいします。
- マップ自動生成は、数学的なアルゴリズムでマップを生成する
- ノイズ関数、セルオートマトン、ダイアモンドスクエアなど、様々な手法がある
- 複数のレイヤーを組み合わせることで、より複雑なマップを生成できる
- 必要な部分だけを生成すれば、効率的に大きなマップを扱える
- シード値を設定すれば、再現可能なマップを生成できる
マップ自動生成は、ゲーム開発で非常に有用な技術です。
数学的なアルゴリズムでマップを生成するため、毎回違うマップを生成したり、大きなマップを効率的に生成したりできます。
ノイズ関数やセルオートマトンなど、様々な手法があります。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、マップ自動生成を含むシェーダーと描画処理を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント