【Unity】Unity Terrain入門:広大な自然環境を効率的に作り上げる地形システム

作成: 2026-02-05最終更新: 2026-07-11

UnityのTerrainシステムを使って広大な自然環境を作成する方法を解説。地形のスカルプト、テクスチャペイント、木や草の配置、パフォーマンス最適化まで詳しく紹介します。

広いフィールドを歩き回れるゲームを作りたい。でも、山や谷を3Dモデリングソフトで1つずつ作って並べるのは、考えただけで気が遠くなる——「地形」は、オープンワールド風のゲームを夢見たときに最初にぶつかる壁ではないでしょうか。

Unity Terrain は、Unity標準の地形作成システムです。ブラシでペイントするように地形を盛り上げ、テクスチャを塗り、木や草を植えていくだけで、広大な自然環境を効率的に作り上げられます。

Terrainのイメージ。白いミニチュア地形のジオラマに青い川と木々が広がり、大きなブラシが丘をペイントするように盛り上げている

この記事でわかること

  • GameObject > 3D Object > Terrainから始める地形作成
  • スカルプト(Raise/Set Height/Smooth/Paint Holes)とショートカット
  • Terrain Layerでのテクスチャペイントと木・草の配置
  • パフォーマンス最適化(Pixel Error・各種Distance設定)
  • 複数Terrainタイルによる広大なマップの分割管理
  • 実践:山道のある山岳フィールド を一枚仕上げる手順

Sponsored

Terrainの作成

メニューからGameObject > 3D Object > Terrainを選択するだけで、1000x1000の平らな地形が生成されます。

5つの主要ツール

ツール説明
Create Neighbor Terrains隣接するTerrainタイルを作成
Paint Terrain地形のスカルプトとテクスチャペイント
Paint Trees木を配置
Paint Details草、花、岩などのディテールを配置
Terrain Settings全般設定(サイズ、解像度、パフォーマンス)
Terrainの5つの主要ツールの一覧。Create Neighbor Terrains(タイルを追加)・Paint Terrain(地形を編集)・Paint Trees(木を配置)・Paint Details(草を配置)・Terrain Settings(全般設定)の5枚のカードが並ぶ

Paint Terrain:地形のスカルプトとペイント

スカルプトツール

ツール説明
Raise or Lower Terrain地形の高さを上げ下げ(Shiftで下げる)
Set Height特定の高さに設定(平らな台地作成に便利)
Smooth Height地形を滑らかに
Stamp Terrainブラシの形をスタンプ
Paint Holes地形に穴を開ける(洞窟入口など)
代表的なスカルプトツール3種の効果。Raise or Lower Terrainは丘を盛り上げ、Set Heightは一定の高さの台地に揃え、Smooth Heightはギザギザの地形をなめらかにする

洞窟の作成手順:

  1. Paint Holesで地形に穴を開ける
  2. 穴の位置に洞窟用の3Dメッシュを配置
  3. メッシュの端とTerrainの境界をシームレスに接続
  4. 必要に応じてコライダーを追加

ショートカット

キー機能
, .ブラシを切り替え
[ ]ブラシサイズを変更
- =不透明度を変更
Fカーソル位置にカメラをフォーカス
Sponsored

Terrain Layer:テクスチャのペイント

Terrain Layerの作成

  1. Paint Terrainツールを選択
  2. ドロップダウンからPaint Textureを選択
  3. Edit Terrain Layers > Create Layerをクリック
  4. テクスチャを設定(Diffuse、Normal Map、Mask Mapなど)

テクスチャのペイント

  1. Terrain Layerを選択
  2. ブラシのサイズと不透明度を設定
  3. 地形をドラッグしてペイント

低い不透明度でペイントすると、下のレイヤーと自然にブレンドされます。

Terrain Layerによるテクスチャ塗り分けの概念図。山のミニチュアが標高に応じて草・土・岩・雪の4つの帯に塗り分けられ、帯の境界はにじみ合ってブレンドされる。ブラシが境界をなでてなじませている

「麓は草、斜面は土と岩、山頂は雪」のように標高に沿って塗り分けるのが定番です。境界をくっきり塗り分けるより、低い不透明度で重ねてにじませた方が自然に見えます。

Terrain Layerの制限

レンダーパイプライン最大レイヤー数備考
URP8レイヤーシェーダーパス増加でパフォーマンス低下
モバイル推奨4レイヤーパフォーマンスを維持するため
Built-in制限なしただし4レイヤーごとに描画パス増加

注意: レイヤー数が増えると描画パスが増加し、パフォーマンスが急激に低下します。モバイルでは4レイヤー以内に抑えることを推奨します。

Trees:木の配置

木の追加

  1. Paint Treesツールを選択
  2. Edit Trees > Add Treeをクリック
  3. 木のPrefabを選択
  4. 地形をドラッグして配置(Shiftで削除)

Mass Place Trees

Mass Place Treesで地形全体にランダムに木を一括配置できます。

木の設定

設定説明
Bend Factor風による揺れの強さ
Billboard Startビルボード表示に切り替わる距離

SpeedTree vs 通常Mesh: SpeedTreeアセットはLOD Group内蔵で自動的にLOD遷移しますが、通常のMeshはBillboard切り替えのみです。高品質な木を使う場合はSpeedTree対応のアセットを推奨します。

Sponsored

Details:草やディテールの配置

ディテールの種類

種類説明
GrassBillboard(板ポリ)で表示。軽量
Detail Mesh3Dメッシュで表示。立体的な表現

ディテールの追加

  1. Paint Detailsツールを選択
  2. Edit Details > Add Grass TextureまたはAdd Detail Meshをクリック
  3. 地形をドラッグして配置

Terrain Settings:設定とパフォーマンス最適化

基本設定

設定説明
Terrain Width/Length/HeightTerrainのサイズ
Heightmap Resolutionハイトマップの解像度(2^n + 1)
Detail Resolutionディテールの解像度

Heightmap Resolution目安

プロジェクト規模解像度備考
プロトタイプ・小規模257×257メモリ消費が少ない
一般的なゲーム513×513バランスが良い
大規模オープンワールド1025×1025高精細だがメモリ消費が大きい
超大規模2049×2049以上複数タイルに分割推奨

Detail Resolution目安

プロジェクト解像度Detail Resolution Per Patch
モバイル512〜10248
PC/コンソール1024〜204816
高品質2048〜409632

パフォーマンス設定

設定説明
Pixel ErrorLODの精度(5〜50が一般的)
Base Map Distanceベースマップに切り替わる距離
Detail Distanceディテールが表示される距離
Tree Distance木が表示される距離
Draw InstancedGPU Instancingで描画を高速化

Draw Instanced: このオプションを有効にすると、GPU Instancingを使用してTerrainの描画が高速化されます。特に複数のTerrainタイルを使用する場合に効果的です。

距離系パフォーマンス設定の概念図。カメラに近いゾーンは草も木も表示され、Detail Distanceを超えると木だけに、Tree Distanceを超えると地形だけになり、Base Map Distanceからは簡易表示に切り替わる

カメラからの距離に応じて「草 → 木 → 地形そのもの」の順に表示が省略されていくイメージです。各Distanceを縮めるほど描画は軽くなりますが、遠景の密度は下がります。

Wind Settings(風の設定)

Terrain Settings > Wind Settings for Grassで草の揺れを設定できます。

設定説明
Speed風の速度
Size風の波の大きさ
Bending草の曲がり具合

Grass Tint: 同じセクション内にある「Grass Tint」は草の色味を調整する設定で、風の影響とは別の見た目調整です。

Wind Settingsの適用範囲:

  • Detail(Grass Texture、Detail Mesh) → 影響を受ける
  • Tree(Paint Treesで配置した木) → 影響を受けない(TreeはBend Factorで個別に設定。SpeedTreeの場合はSpeedTree側のWind設定が使用される)

複数のTerrainタイル

大規模なマップを作成する場合、複数のTerrainタイルに分割することでパフォーマンスを向上させることができます。

タイルの作成

  1. Terrainを選択
  2. Create Neighbor Terrainsツールをクリック
  3. どの方向にタイルを作成するかを選択

タイルは自動的にシームレスに接続されます。

複数Terrainタイルの概念図。3×3のタイルに分割された地形が隙間なく並び、Create Neighbor Terrainsで新しいタイルが追加される。境界はシームレスに接続される

TerrainGroupによる一括管理

大規模なマップでは、Terrain.SetNeighbors()でタイル間の接続を設定し、TerrainGroup コンポーネントで複数のTerrainを一括管理できます。

Terrain Tools: Terrain Toolsパッケージ(Unity 2022以降ではプレインストールされている場合あり)を使用すると、複数タイルの一括編集がさらに便利になります。

Heightmapのインポート・エクスポート

Terrain Settings > Import Raw / Export Rawで、16bit RAW形式のファイルを入出力できます。World Machine、Gaiaなど外部ツールとの連携や、Photoshopで作成したグレースケール画像からの地形生成に使用します。

スクリプトからの地形操作

TerrainDataを使って、スクリプトから地形を操作できます。

using UnityEngine;

public class TerrainModifier : MonoBehaviour
{
    Terrain terrain;
    TerrainData terrainData;

    void Start()
    {
        terrain = GetComponent<Terrain>();
        terrainData = terrain.terrainData;
    }

    // 高さを取得・設定(x, yはピクセル座標)
    // 重要: heights配列のインデックスは[y, x](行, 列)の順
    // terrainData.GetHeights(xBase, yBase, width, height)の引数は(x, y)順
    // だが、返される配列は heights[y, x] でアクセスする
    public void ModifyHeight(int x, int y, float height)
    {
        float[,] heights = terrainData.GetHeights(x, y, 1, 1);
        heights[0, 0] = height;  // 0〜1の範囲
        terrainData.SetHeights(x, y, heights);
    }

    // ワールド座標からピクセル座標へ変換(範囲チェック付き)
    // heightmapResolutionが513の場合、有効なピクセル座標は0〜512
    public Vector2Int WorldToHeightmapCoord(Vector3 worldPos)
    {
        Vector3 terrainPos = worldPos - terrain.transform.position;
        int maxIndex = terrainData.heightmapResolution - 1;
        int x = Mathf.Clamp(
            Mathf.RoundToInt(terrainPos.x / terrainData.size.x * maxIndex),
            0, maxIndex);
        int y = Mathf.Clamp(
            Mathf.RoundToInt(terrainPos.z / terrainData.size.z * maxIndex),
            0, maxIndex);
        return new Vector2Int(x, y);
    }

    // テクスチャ(Alphamap)を設定
    public void PaintTexture(int x, int y, int layerIndex)
    {
        float[,,] alphas = terrainData.GetAlphamaps(x, y, 1, 1);
        // すべてのレイヤーをリセット
        for (int i = 0; i < alphas.GetLength(2); i++)
            alphas[0, 0, i] = 0;
        alphas[0, 0, layerIndex] = 1;
        terrainData.SetAlphamaps(x, y, alphas);
    }
}

用途: プロシージャル地形生成、ランタイムでの地形変形(掘削、整地など)に使用します。

座標系の注意: heightmapResolutionalphamapResolutionは異なる値を返す場合があります。Heightmap座標とAlphamap座標を混同しないよう注意してください。

HeightmapとAlphamapの解像度の違い:

プロパティ値の特徴
heightmapResolution2^n + 1513, 1025
alphamapResolution2^n512, 1024

Perlinノイズによるプロシージャル地形生成

public void GenerateProceduralTerrain(float scale, float heightMultiplier)
{
    int res = terrainData.heightmapResolution;
    float[,] heights = new float[res, res];

    // オフセットを加えることでバリエーションを生成
    // Mathf.PerlinNoiseは同じ入力で常に同じ結果を返すため
    float offsetX = Random.Range(0f, 10000f);
    float offsetY = Random.Range(0f, 10000f);

    for (int y = 0; y < res; y++)
    {
        for (int x = 0; x < res; x++)
        {
            heights[y, x] = Mathf.PerlinNoise(
                (x + offsetX) / (float)res * scale,
                (y + offsetY) / (float)res * scale
            ) * heightMultiplier;
        }
    }
    terrainData.SetHeights(0, 0, heights);
}

Terrain Toolsパッケージ

Terrain Tools パッケージをインストールすると、追加のスカルプトツールや侵食シミュレーションなどの高度な機能が使えます。

インストール方法

  1. Window > Package Managerを選択
  2. +ボタンからAdd package by name...を選択
  3. com.unity.terrain-toolsを入力してインストール

追加されるツール

ツール説明
Bridge2つの地点を橋で接続
Clone地形の一部をコピーペースト
Erosion侵食シミュレーション(風化、水流など)
Terrace段々畑のような階段状の地形を作成
Noiseノイズベースの地形生成
Sponsored

実践:山道のある山岳フィールドを一枚仕上げる

オープンワールドRPGの草原と雪山、サバイバルクラフトの拠点を囲む森、レースゲームの背景に流れる山並み——ジャンルは違っても、「山があり、道が通り、木と草の生えたフィールド」はTerrainの定番の成果物です。ここまでのツールを通しで使って、探索できる山岳フィールドを一枚仕上げてみましょう。

完成イメージ。奥に雪�山がそびえ、麓の平地から中腹へ蛇行する一本道が通り、斜面には木、麓には湖と草の密集エリアがあるクレイ風ジオラマ
  1. サイズと解像度を決める: Terrain SettingsでWidth/Lengthを500×500、Heightmap Resolutionを513×513に。最初から1000×1000で作るより、狭めの一枚で完成させる方が確実に上達します
  2. 大きな起伏から作る: Raise or Lower Terrainの大きなブラシで奥に山の稜線を盛り上げ、Set Heightで麓に平らな台地(拠点や村の予定地)を作ります
  3. 道を通す: Set Heightを低い不透明度で使い、麓から中腹へ蛇行する一本道の高さを均します。仕上げにSmooth Heightで道の縁をならすと歩ける道に見えてきます
  4. テクスチャを塗る: 草→土→岩→雪の4レイヤーを標高に沿ってペイントし、道の上だけ土レイヤーで上書きします(4レイヤーはモバイル推奨上限とも一致します)
  5. 木と草を植える: Mass Place Treesで一括配置してから、道の上と台地だけShiftドラッグで間引きます。草(Detail)はプレイヤーがよく歩く麓だけ濃くすると軽さと見栄えを両立できます
  6. 距離設定で仕上げる: Terrain SettingsでPixel Error・Tree/Detail Distanceを調整し、GameビューのStatsでフレームレートを確認します

ポイントは2つです。

  • 「大きな起伏→細部」の順で作る: 先に道や小さな凹凸を作り込んでも、後から山を盛り直すと崩れてしまいます。山→台地→道→植生の順なら手戻りがありません
  • ゲームプレイの動線から先に決める: 道・拠点・見せ場の位置を決めてから、それに合わせて地形を作ります。見た目から作り始めると「きれいだけど遊びにくい」マップになりがちです

木や草を増やしすぎて重くなってきたら、ドローコール最適化の記事モバイル最適化の記事 が助けになります。

おまけ:先に知っておくと良いこと

フィールドが形になってくると、次はこのあたりが視野に入ってきます。名前だけでも知っておくと迷いません。

  • 地形の上をAIに歩かせたい: Terrainはそのまま NavMesh のベイク対象にできます。敵やNPCにこのフィールドを巡回させる方法は NavMeshの記事 で解説しています。
  • 岩や建物などの小物は3Dモデルで置く: Terrainが受け持つのは地面だけです。上に載せる岩・橋・建物は通常の3Dモデルをインポートして配置します。3Dモデルインポートの記事 が参考になります。
  • 描画まわりの制約はレンダーパイプライン次第: Terrain Layerの上限(URPは8レイヤー)のように、Terrainの描画仕様はパイプラインに依存します。レンダーパイプラインの記事 を読むと全体像がつかめます。

まとめ

Unity Terrainは、大規模な自然環境を効率的に作成できる強力なシステムです。

  • Paint Terrain - ブラシで地形をスカルプト、テクスチャをペイント
  • Paint Trees / Paint Details - 木や草を素早く配置
  • LODとカリング - パフォーマンス最適化機能が充実
  • 複数タイル - 巨大なオープンワールドにも対応

まずは500×500の一枚から。あなたのゲームの舞台は、どんな地形の上に広がっているでしょうか?