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

地形の自動生成は、数学的なアルゴリズムを使って、地形データを計算によって生成する処理です。
手動で地形を作るのではなく、プログラムで自動的に地形を生成します。
これにより、毎回異なる地形を生成したり、大きな地形を効率的に生成したりできます。
地形自動生成には、パーリンノイズ、ダイアモンドスクエアアルゴリズム、セルオートマトンなど、様々な手法があります。
Unityでは、これらのアルゴリズムを実装して、地形を自動生成できます。
ゲームでの具体的な使い道

地形の自動生成が、ゲームでどう使われているか確認してみましょう。
オープンワールドゲーム
広大なフィールドを、自動生成で作成します。
必要な範囲だけを生成すれば、メモリ効率を向上させます。
ローグライクゲーム
毎回異なるダンジョンや地形を生成します。
プレイのたびに新しい地形で、探索の楽しさを向上させます。
サンドボックスゲーム
無限に広がる地形を、プロシージャルに生成します。
プレイヤーの移動に合わせて、必要な範囲を生成します。
地形エディタ
エディタ機能として、地形を自動生成します。
プレイヤーが、生成した地形を編集できるようにします。
- オープンワールドゲーム(広大なフィールド)
- ローグライクゲーム(毎回異なる地形)
- サンドボックスゲーム(無限地形)
- 地形エディタ(自動生成機能)
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

地形の自動生成は、「シード値の設定 → ノイズ関数の生成 → 高さデータの計算 → メッシュの生成」という流れで実現できます。
シード値の設定
シード値を設定すれば、再現可能な地形を生成します。
同じシード値なら、同じ地形が生成されます。
ノイズ関数の生成
パーリンノイズなどのノイズ関数を使って、ランダムな値を生成します。
座標を入力として、連続的な値を出力します。
高さデータの計算
ノイズ関数の値から、地形の高さを計算します。
複数のオクターブを重ね合わせて、より自然な地形を生成します。
メッシュの生成
高さデータから、地形メッシュを生成します。
各頂点の高さを設定して、メッシュを作成します。
- 地形自動生成は、数学的なアルゴリズムで地形を生成する
- シード値を設定すれば、再現可能な地形を生成できる
- ノイズ関数を使って、自然な地形を生成できる
- 複数のオクターブを重ね合わせることで、より詳細な地形を作れる
Unityで実装する際の注意点(代表例)

Unityで地形を自動生成する場合の注意点を見ていきましょう。
基本的な地形生成
UnityのMathf.PerlinNoiseを使った、基本的な地形生成です。
|
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 |
public class TerrainAutoGenerator : MonoBehaviour { public int width = 100; public int height = 100; public float scale = 10f; public float heightMultiplier = 10f; void Start() { Mesh mesh = GenerateTerrain(); GetComponent().mesh = mesh; } Mesh GenerateTerrain() { Mesh mesh = new Mesh(); Vector3[] vertices = new Vector3[width * height]; Vector2[] uvs = new Vector2[width * height]; int[] triangles = new int[(width - 1) * (height - 1) * 6]; for (int z = 0; z < height; z++) { for (int x = 0; x < width; x++) { float y = Mathf.PerlinNoise(x / scale, z / scale) * heightMultiplier; vertices[z * width + x] = new Vector3(x, y, z); uvs[z * width + x] = new Vector2(x / (float)width, z / (float)height); } } int triIndex = 0; for (int z = 0; z < height - 1; z++) { for (int x = 0; x < width - 1; x++) { int bottomLeft = z * width + x; int bottomRight = bottomLeft + 1; int topLeft = bottomLeft + width; int topRight = topLeft + 1; triangles[triIndex++] = bottomLeft; triangles[triIndex++] = topLeft; triangles[triIndex++] = bottomRight; triangles[triIndex++] = bottomRight; triangles[triIndex++] = topLeft; triangles[triIndex++] = topRight; } } mesh.vertices = vertices; mesh.uv = uvs; mesh.triangles = triangles; mesh.RecalculateNormals(); return mesh; } } |
シード値を使った再現可能な生成
シード値を設定して、同じ地形を再現できるようにします。
|
1 2 3 4 5 6 7 8 9 10 11 |
public class SeededTerrainGenerator : MonoBehaviour { public float seed = 100f; public float GenerateHeight(float x, float z, float scale) { // シード値を座標に加算 return Mathf.PerlinNoise((x / scale) + seed, (z / scale) + seed) * 10f; } } |
チャンク単位での生成
大きな地形を、チャンク単位で生成します。
|
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 |
public class ChunkedTerrain : MonoBehaviour { public int chunkSize = 50; private Dictionary chunks = new Dictionary(); void Update() { Vector3 playerPos = transform.position; int chunkX = Mathf.FloorToInt(playerPos.x / chunkSize); int chunkZ = Mathf.FloorToInt(playerPos.z / chunkSize); // プレイヤー周辺のチャンクを生成 for (int z = -2; z <= 2; z++) { for (int x = -2; x <= 2; x++) { Vector2Int chunkCoord = new Vector2Int(chunkX + x, chunkZ + z); if (!chunks.ContainsKey(chunkCoord)) { GenerateChunk(chunkCoord); } } } } void GenerateChunk(Vector2Int coord) { // チャンクの地形を生成 // 実装は上記のGenerateTerrainと同様 } } |

まとめ

この記事では、地形を自動生成する方法について見てきました。
重要なポイントをおさらいします。
- 地形自動生成は、数学的なアルゴリズムで地形を生成する技術
- シード値を設定すれば、再現可能な地形を生成できる
- ノイズ関数を使って、自然な地形を生成できる
- チャンク単位で生成すれば、大きな地形にも対応できる
- UnityのMathf.PerlinNoiseで簡単に実装できる
地形の自動生成は、プロシージャル生成で重要な技術です。
数学的なアルゴリズムを使うことで、効率的に多様な地形を生成できます。
オープンワールドゲームや、ローグライクゲームなど、様々な場面で活用できますね。
実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、地形生成を含むシェーダーと描画処理を、実際のゲーム実装とともに体系的に学べます。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント