この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:atom
更新日時:2026-06-11 07:29:05

タイトル: 地形の作成
SEOタイトル: Unity Terrain 作成完全ガイド(Heightmap・草・木・Paint Texture・Unity 6 改善)

この記事の要点
  • GameObject > 3D Object > Terrain で Terrain オブジェクトを生成(または Hierarchy 右クリック)
  • Terrain ツールバー: Raise/Lower / Set Height / Smooth / Paint Texture / Paint Trees / Paint Details / Wind
  • Heightmap PNG (グレースケール) をインポートして既存地形を読み込み可能
  • Tree / Detail (草・小石) は GPU インスタンシングで描画、Detail Distance / Tree Distance で LOD 管理
  • Unity 6 ではTerrain Tools パッケージSplatmap GPU 化で大規模地形のパフォーマンスが向上

Terrain とは

Unity の Terrain は大規模な屋外地形を効率的に作成・描画するためのコンポーネントです。Heightmap(高さマップ)と Splatmap(テクスチャの混ぜ方)を内部で持ち、専用シェーダーで GPU 描画されます。

Unity Terrain 全体イメージ

1. Terrain オブジェクトを作成する

  1. メニュー GameObject > 3D Object > Terrain(または Hierarchy 右クリック > 3D Object > Terrain)
  2. シーンに 1000m × 1000m の平らな Terrain が生成される
  3. Inspector に Terrain コンポーネントと TerrainCollider が自動で付く
  4. Terrain ツールバー(ペイントブラシ / 山 / 草 / 木 アイコン)から地形編集を開始

2. Terrain ツール一覧

ツール機能主な設定
Raise/Lower Terrainクリックで盛り上げ、Shift で凹ませるBrush Size / Opacity
Paint Height指定の高さに均すHeight(目標高さ)
Smooth Height凹凸を滑らかにStrength
Stamp Terrainブラシ形状の高さを一気にスタンプBrush, Height, Subtract
Paint Texture草 / 岩 / 砂 などのテクスチャを塗るLayer / Target Strength
Paint Trees樹木を植える(プレハブ)Tree Density / Random Rotation
Paint Details草・小石(ビルボード)Detail Distance
Wind / Bake風で揺らす / ライトベイクWind Speed, Bend

Terrain ツールバーと Paint Texture 編集

3. Heightmap をインポートして地形を読み込む

外部の DEM データ(国土地理院など)や Photoshop で作ったグレースケール PNG/RAW を読み込めます。

  1. Terrain コンポーネントの歯車アイコン (Terrain Settings)を開く
  2. Texture Resolutions (On Terrain Data) > Heightmap Resolution を確認(513, 1025, 2049, 4097)
  3. Import Raw... ボタンから 16-bit Raw / PNG を選択
  4. Width / Height / Byte Order (Mac/Windows) を指定して Import

解像度設定のセオリー

  • Terrain Width / Length: 大きすぎる地形は描画コストが高い → 1000m 程度を複数 Terrain で繋ぐのが現実的
  • Heightmap Resolution: 1025 で実用。2 のべき乗 + 1 である必要
  • Detail Resolution: 1024 程度。草を多く置く場合は 2048 でも OK
  • Control Texture Resolution: テクスチャブレンドの解像度。512〜1024 で十分
  • Base Texture Resolution: 遠景で使う合成テクスチャ。1024 で OK

4. Terrain Layer(テクスチャ)の設定

Paint Texture モードで使う草・岩・砂のテクスチャはTerrain Layer アセットとして登録します。

1. Project Window で右クリック > Create > Terrain Layer
2. Diffuse / Normal Map をドラッグ&ドロップ
3. Metallic / Smoothness / Specular を設定
4. Tile Size (m) を指定 (例: 8 × 8)
5. Terrain の Paint Texture モードで Layer リストに追加

ヒント:
- 最大 4 Layer/ピクセル しか同時に使えない (Splatmap RGBA)
- 5 枚以上使う場合は Terrain 内で領域を分けるか、Unity Terrain Tools の追加 splatmap を利用
- Normal Map を入れると遠景でも凹凸感が出る

5. 樹木(Trees)を植える

  1. Paint Trees モードに切替
  2. Edit Trees... > Add Tree で Tree プレハブ(SpeedTree / Standard Tree Creator / 任意プレハブ)を登録
  3. Brush Size / Tree Density / Tree Height でランダム変動を設定
  4. Shift + クリックで消去、Ctrl + クリックで特定の木種だけ消去

Paint Trees と Paint Details の設定

Tree LOD / Billboard 設定

  • Tree コンポーネントの LOD Group で距離別メッシュを設定
  • Terrain Settings > Tree Distance:木を描画する最大距離
  • Billboard Start:この距離以降は板ポリ(ビルボード)に置換
  • Fade Length:ビルボード切替時のフェード
  • Max Mesh Trees:メッシュとして表示する最大本数

6. 草・小石(Details)

Paint Details モードで草や小石(メッシュ or ビルボード)を密度で配置します。

  • Edit Details > Add Grass Texture(草テクスチャ) or Add Detail Mesh(メッシュ)
  • Min/Max Width / Height でランダムスケール
  • Healthy/Dry Color で色のバリエーション
  • Bend Factor / Wave Tint で風揺れ表現
  • Terrain Settings > Detail Distance で描画距離(重い場合は短く)

7. Terrain Settings の Performance 調整

項目役割推奨
Pixel Error遠距離での Heightmap 解像度の許容誤差5(軽量)/ 1(高品質)
Base Map Distance詳細テクスチャを使う距離1000m(標準)
Cast Shadows地形が影を落とすか必要に応じて
Draw InstancedGPU インスタンシング★ ON 推奨(軽量化)
Reflection Probes反射プローブの混合方式Blend Probes
MaterialTerrain 用シェーダーURP/HDRP の Terrain Lit

8. スクリプトから Terrain を操作する

using UnityEngine;

public class TerrainSampler : MonoBehaviour
{
    void Start()
    {
        Terrain terrain = Terrain.activeTerrain;
        TerrainData data = terrain.terrainData;

        // 中心点の高さ
        Vector3 pos = terrain.transform.position;
        float centerX = pos.x + data.size.x / 2f;
        float centerZ = pos.z + data.size.z / 2f;
        float h = terrain.SampleHeight(new Vector3(centerX, 0, centerZ));
        Debug.Log($"中心の高さ: {h}m");

        // Heightmap を配列で取得して書き換え
        int res = data.heightmapResolution;
        float[,] heights = data.GetHeights(0, 0, res, res);
        for (int y = 0; y < res; y++)
            for (int x = 0; x < res; x++)
                heights[y, x] += 0.01f; // 全体を 1% 持ち上げ
        data.SetHeights(0, 0, heights);
    }
}

Unity 6 / 最新版での改善点

  • Terrain Tools パッケージ(Package Manager 経由)でブラシが大幅強化(Noise / Erosion / Hydraulic Erosion)
  • URP / HDRP の Terrain Lit シェーダーが標準化、Normal Map + Mask Map 対応
  • Detail / Tree の GPU インスタンス描画がデフォルト ON で大量配置時の負荷低減
  • Terrain Holes(穴あけ)対応で洞窟入口や谷を Terrain に直接開けられる
  • Terrain と HD Render Pipeline の Decal Projector 組合せで道や苔の表現が容易

FAQ

Q: 複数 Terrain を繋いだら継ぎ目に段差ができる
A: Terrain Tools の Stitch Terrains ボタンを使うか、Neighbors 設定で隣接 Terrain を登録して同じ高さに揃えてください。

Q: Terrain が重い
A: Pixel Error を大きく / Detail Distance を短く / Draw Instanced を ON / Tree Distance を短くしてください。Static Batching も有効です。

Q: Heightmap を Photoshop で作る場合の注意
A: 16bit グレースケールのRAW 形式で保存。Little Endian (Windows) / Big Endian (Mac) を Import 時に合わせる必要があります。