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

地形生成アルゴリズムは、数学的な関数を使って、地形の高さデータを生成する処理です。
ノイズ関数を使って、ランダムでありながら連続的な値を生成します。
これにより、自然な地形の起伏を表現できます。
パーリンノイズや、その他のノイズ関数を組み合わせることで、様々な地形を生成できます。
Unityでは、PerlinNoise関数や、カスタムのノイズ関数を使って実装できます。
ゲームでの具体的な使い道

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

地形生成アルゴリズムは、「ノイズ関数の生成 → 複数のオクターブの合成 → 高さデータの計算 → 地形メッシュの生成」という流れで実現できます。
ノイズ関数の生成
パーリンノイズなどのノイズ関数を使って、ランダムな値を生成します。
座標を入力として、連続的な値を出力します。
複数のオクターブの合成
異なる周波数のノイズを重ね合わせます。
低周波のノイズで大きな起伏を、高周波のノイズで細かい起伏を表現します。
高さデータの計算
ノイズ関数の値から、地形の高さを計算します。
値をスケールして、適切な高さ範囲にマッピングします。
地形メッシュの生成
高さデータから、地形メッシュを生成します。
各頂点の高さを設定して、メッシュを作成します。
- 地形生成アルゴリズムは、ノイズ関数を使って地形を生成する
- 複数のオクターブを合成すれば、自然な地形を作れる
- パーリンノイズは、滑らかで連続的な値を生成できる
- UnityのPerlinNoise関数や、カスタム実装で実現できる
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 60 |
public class TerrainGenerator : MonoBehaviour { public int width = 100; public int height = 100; public float scale = 10f; void Start() { Mesh mesh = GenerateTerrainMesh(); GetComponent().mesh = mesh; } Mesh GenerateTerrainMesh() { 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) * 10f; 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 12 13 14 15 16 17 18 19 |
public float GenerateHeight(float x, float z) { float height = 0f; float amplitude = 1f; float frequency = 1f; int octaves = 4; for (int i = 0; i < octaves; i++) { float noiseValue = Mathf.PerlinNoise(x * frequency / scale, z * frequency / scale); height += noiseValue * amplitude; amplitude *= 0.5f; // 振幅を減らす frequency *= 2f; // 周波数を増やす } return height; } |
シード値を使った再現可能な生成
シード値を使って、同じ地形を再現できるようにします。
|
1 2 3 4 5 6 |
public float GenerateHeightWithSeed(float x, float z, float seed) { // シード値を座標に加算 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 |
public class ChunkedTerrainGenerator : MonoBehaviour { public int chunkSize = 50; public int renderDistance = 3; void Start() { Vector3 playerPos = transform.position; int chunkX = Mathf.FloorToInt(playerPos.x / chunkSize); int chunkZ = Mathf.FloorToInt(playerPos.z / chunkSize); // プレイヤー周辺のチャンクを生成 for (int z = -renderDistance; z <= renderDistance; z++) { for (int x = -renderDistance; x <= renderDistance; x++) { GenerateChunk(chunkX + x, chunkZ + z); } } } void GenerateChunk(int chunkX, int chunkZ) { // チャンクの地形を生成 // 実装は上記のGenerateTerrainMeshと同様 } } |

まとめ

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





コメント