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

作成: 2026-02-05

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

概要

「オープンワールドのゲームを作りたいけど、広大なマップをどうやって作ればいいんだろう…」

Unity Terrain は、Unity標準の地形作成システムで、広大な自然環境を効率的に作成できます。ブラシでペイントするように地形を編集し、テクスチャを塗り、木や草を配置することで、リアルな世界を作り上げることができます。

Terrainの作成

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

5つの主要ツール

ツール説明
Create Neighbor Terrains隣接するTerrainタイルを作成
Paint Terrain地形のスカルプトとテクスチャペイント
Paint Trees木を配置
Paint Details草、花、岩などのディテールを配置
Terrain Settings全般設定(サイズ、解像度、パフォーマンス)

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

スカルプトツール

ツール説明
Raise or Lower Terrain地形の高さを上げ下げ(Shiftで下げる)
Set Height特定の高さに設定(平らな台地作成に便利)
Smooth Height地形を滑らかに
Stamp Terrainブラシの形をスタンプ
Paint Holes地形に穴を開ける(洞窟入口など)

洞窟の作成手順:

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

ショートカット

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

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の制限

レンダーパイプライン最大レイヤー数備考
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対応のアセットを推奨します。

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タイルを使用する場合に効果的です。

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. どの方向にタイルを作成するかを選択

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

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ノイズベースの地形生成

まとめ

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

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

ぜひ、Terrainを活用して、あなただけの広大な世界を作り上げてください。