2.

Unity Terrain ペイント完全ガイド

編集
この記事の要点
  • Unity の Terrain コンポーネントで、地面に複数のテクスチャ(草・土・岩等)をブラシで塗り重ねる
  • まず TerrainLayer アセットを作成(Project ウィンドウで右クリック → Create → Terrain Layer)
  • Terrain Inspector の Paint Terrain → Paint Texture でレイヤを Edit Terrain Layers に追加
  • Brush Size / Opacity / Target Strength を調整。Target Strength は最大濃度の上限
  • 内部的に Splatmap(重みテクスチャ)で複数レイヤをブレンド。1 つの Splatmap は 4 レイヤまで(RGBA)
  • URP / HDRP では Terrain 専用シェーダ(URP Terrain Lit / HDRP Terrain Lit)に切替必要

Terrain にテクスチャをペイントする手順

Unity Terrain の地面に、草・土・岩・砂などのテクスチャを塗り分ける手順を解説します。地形の見た目を作る最も基本的な操作です。

準備: Terrain と TerrainLayer

1. Terrain を作成

  1. Hierarchy で右クリック → 3D Object → Terrain
  2. 巨大な平面(デフォルト 1000m × 1000m)が生成される
  3. Inspector に Terrain コンポーネントと Terrain Collider が付く

2. TerrainLayer アセットを作る

TerrainLayer はテクスチャとそのタイリング・法線マップをまとめたアセットです:

  1. Project ウィンドウで右クリック → Create → Terrain Layer
  2. 名前を付ける(例: Grass_Layer
  3. Inspector で:
    • Diffuse: アルベドテクスチャ(草、土等)
    • Normal Map: 法線テクスチャ(凹凸感)
    • Mask Map(URP/HDRP): メタリック・スムースネス・オクルージョン・高さ
    • Tiling Settings → Size: 1 タイルの実寸(例 1×1 メートル)

Paint Texture でペイント

Terrain を選択 → Inspector のツールバーから 4 つ目のブラシアイコン Paint Terrain をクリック → ドロップダウンを Paint Texture に。

項目意味
Terrain Layersこのターレインで使うレイヤー一覧。Edit Terrain Layers → Add Layer で TerrainLayer アセットを追加
Brushesブラシ形状(円、四角、ノイズ等)
Brush Sizeブラシ半径(メートル)
Opacity1 ストロークの効きの強さ(0-100)
Target Strength同じ箇所を塗り続けた時の最大濃度(0-1)。0.5 にすると半分混じった状態が上限

ペイントの流れ

  1. 最初に追加したレイヤーがベースレイヤとして全面に塗られる(通常は草)
  2. 2 つ目以降のレイヤを選択し、シーンビューで Terrain 上をドラッグして塗る
  3. 強く塗りたい場所は Brush Size を小さく、Opacity を上げる
  4. Shift + ドラッグで「下のレイヤを表示」(消しゴム的に使える)

Splatmap の仕組み

Terrain のテクスチャブレンドは Splatmap と呼ばれる重みテクスチャで管理されます:

  • 各ピクセルが「このレイヤをどの程度の強さで塗るか」を表す
  • 1 つの Splatmap は RGBA の 4 チャンネル → 1 枚で 4 レイヤ
  • 5 レイヤ以上使うと自動で 2 枚目の Splatmap が追加(パフォーマンス低下)
  • 解像度は Terrain Settings → Control Texture Resolution で変更(デフォ 512)
// スクリプトから Splatmap を直接編集する例
using UnityEngine;

public class TerrainSplatPainter : MonoBehaviour
{
    void Start()
    {
        Terrain terrain = GetComponent();
        TerrainData data = terrain.terrainData;
        int w = data.alphamapWidth;
        int h = data.alphamapHeight;
        int layers = data.alphamapLayers;

        // 既存の重みを取得
        float[,,] map = data.GetAlphamaps(0, 0, w, h);

        // 全面をレイヤ 0 (草) で塗りつぶす
        for (int y = 0; y < h; y++)
            for (int x = 0; x < w; x++)
            {
                for (int l = 0; l < layers; l++) map[y, x, l] = 0;
                map[y, x, 0] = 1f;
            }

        data.SetAlphamaps(0, 0, map);
    }
}

Heightmap と Splatmap の関係

マップ役割解像度設定
Heightmap地形の高さ(凸凹)Terrain Width / Length × Resolution
Splatmap (Alphamap)各レイヤのブレンド重みControl Texture Resolution(512 / 1024)
Detail Map草・小物の密度Detail Resolution

レイヤを自動で高さ・傾斜で配置

Terrain Tools パッケージをインストールすると、Stamp TerrainErosion に加えて、角度に応じて自動で岩レイヤを塗る機能が使えます:

  1. Package Manager → Terrain Tools をインストール
  2. Paint Terrain → Slope ツールで急斜面に岩レイヤを自動適用
  3. または Height ツールで標高に応じて雪レイヤを上部に

URP / HDRP の Terrain Material

Built-in Render Pipeline と SRP では Terrain の見た目シェーダが違います:

パイプラインTerrain Material
Built-inNature/Terrain/Standard
URPUniversal Render Pipeline/Terrain/Lit
HDRPHDRP/TerrainLit

Terrain Inspector → 歯車(Terrain Settings)→ Material で切替。URP プロジェクトで Built-in シェーダのままだとピンクになります。

パフォーマンス最適化

  • Pixel Error: 大きくすると LOD が荒くなり高速化。5-10 推奨
  • Base Map Distance: この距離より遠くは低解像版を使う。300-500m が目安
  • Draw Instanced: GPU Instancing で Terrain を描画。チェック推奨
  • Detail Distance: 草を描く距離。短いほど高速
  • レイヤ数を 4 以下に抑える(Splatmap 1 枚で済む)

よくあるトラブル

Q: ペイントしても色が変わらない
A: ① TerrainLayer をまだ追加していない、② Brush Size がエリア外、③ URP/HDRP でシェーダ不一致でマテリアルが壊れている。Terrain Settings の Material を確認。

Q: テクスチャが伸びる・繰り返しが目立つ
A: TerrainLayer の Tiling Settings → Size を実寸に。1 タイルが何メートルか意識すると自然になります。広範囲は法線マップで凹凸を強調するとパターン感が減ります。

Q: 5 つ目のレイヤを追加したら重くなった
A: Splatmap が 2 枚になり、ドローコールが約 2 倍に。シーンに応じてレイヤを 4 以下に整理してください。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 地形の作成
  2. 地形をペイントする
  3. 地形に高低をつける
  4. 木を植える
  5. 小物を配置する