4.

Unity Terrain で木を植える方法 — Paint Trees / 草 / LOD / SpeedTree

編集
この記事の要点
  • Unity Terrain の Paint Trees ツールで木を一筆描き感覚で配置可能
  • Tree Prefab を Edit Trees → Add Tree で登録、ブラシサイズ・密度・回転を設定
  • 広域に一気に置くなら Mass Place Trees (個数指定でランダム配置)
  • 草や小オブジェクトは Paint Details (テクスチャ草 or 簡易メッシュ草)
  • LOD / SpeedTree 採用で遠方の木も低負荷描画

Terrain の基礎

Unity Terrain は地形 (Height Map) + テクスチャ + 木 + 草 + 風 + Lightmap UV をまとめて扱える専用システムです。木は Terrain の機能の一部として植えられます。

  1. Hierarchy → 3D Object → Terrain を作成
  2. Terrain Inspector のツールバーで 木のアイコン (Paint Trees) を選択
  3. Edit Trees → Add Tree で木の Prefab を登録
  4. Terrain 上をクリック / ドラッグで植える

Paint Trees の主要パラメータ

パラメータ意味
Brush Size1 回クリックで影響を及ぼす円の半径
Tree Densityブラシ内に配置する木の密度
Tree Height木の高さスケール (Random Range 推奨)
Lock Width to Height高さに合わせて幅も比例
Random Tree RotationY 軸ランダム回転 (同じ木が一様に見えるのを防ぐ)
Color Variation葉色のランダム差

木の Prefab を入手する

入手元内容備考
Asset Store無料 / 有料の木 Prefab 多数「tree」「foliage」で検索
HDRP / URP Terrain Sample公式サンプルに含まれるPackage Manager から
SpeedTreeLOD 付きの本格樹木有料 / Subscription
Polygonal Tree Packローポリ向けモバイル / Switch 向け

Mass Place Trees (大量配置)

森全体を一気に作りたい時に便利な機能です。

  1. Paint Trees ツール内の右上メニュー Mass Place Trees
  2. Number of Trees に植えたい本数 (例: 5000)
  3. Keep Existing Trees にチェックを入れると追加配置、外すと置換
  4. OK で全 Terrain にランダム配置

その後、欠落地帯を Paint Trees ツールで手動補正します。

個別の木を削除

  • Shift + ドラッグ: ブラシ範囲の木を削除
  • Ctrl + ドラッグ: 選択した種類の木だけを削除

Detail (草) を植える

木と同じ Terrain ツールバーの 花アイコン (Paint Details) から草や小石を植えられます。

Detail Type用途負荷
Grass Texture (Billboard)カメラに常に向く 2D 草軽い
Detail Mesh3D メッシュ (石 / きのこ等)
Detail Mesh (Vertex Lit)影なし軽量メッシュ軽い

LOD で遠方を軽くする

遠くの木まで高ポリゴンで描くと一気に重くなります。LOD Group を仕込んだ Prefab を使うと自動で簡略化されます。

LOD0: 距離 0–20m   → 高品質 (フル枝葉)
LOD1: 距離 20–60m  → 中品質 (枝葉減)
LOD2: 距離 60–150m → ビルボード (板1枚)
カリング: 150m 以上 → 描画しない

SpeedTree と HD Tree Pack

本格的な森林表現には以下が定番:

  • SpeedTree — 業界標準。風揺れ・季節変化・自動 LOD
  • HD Tree Pack (Asset Store) — HDRP 向け高品質
  • Conifer BOTD — 無料針葉樹アセット
  • Book of the Dead サンプル — Unity 公式デモのアセット

スクリプトから木を植える

using UnityEngine;

public class TreePlanter : MonoBehaviour {
    [SerializeField] private Terrain terrain;
    [SerializeField] private int prototypeIndex = 0;
    [SerializeField] private int count = 100;

    void Start() {
        TerrainData td = terrain.terrainData;
        var instances = new System.Collections.Generic.List();

        for (int i = 0; i < count; i++) {
            TreeInstance t = new TreeInstance {
                position = new Vector3(Random.value, 0, Random.value),  // 0-1 の正規化座標
                prototypeIndex = prototypeIndex,
                widthScale = 1f,
                heightScale = Random.Range(0.8f, 1.2f),
                color = Color.white,
                lightmapColor = Color.white,
                rotation = Random.Range(0f, Mathf.PI * 2f),
            };
            instances.Add(t);
        }

        td.treeInstances = instances.ToArray();
    }
}

パフォーマンス Tips

  • Tree Distance (Terrain Settings) を下げる → 描画距離短縮
  • Billboard Start を 50–80m → 遠方を 2D 化
  • Fade Length 5m → 切替を滑らかに
  • Max Mesh Trees 50 程度 → 同時 3D 表示数
  • 1 Terrain あたり 1 万本以下 を目安に

よくあるトラブル

症状原因対処
木が真っ黒ライティング未ベイク / マテリアル不整合Lighting → Generate / Material を URP 用に
木がピンクShader 不一致 (URP に Built-in 木)マテリアルを URP/Lit に
木が地面に埋まるPivot 位置が中心Prefab の Pivot を根本に
FPS が極端に低いTree Density 過大Tree Distance / Billboard 設定見直し

FAQ

Q: ProBuilder で作った木を Terrain に登録できる?
A: 可能。Prefab 化して LOD Group を追加し、Add Tree で登録します。

Q: 木に当たり判定を付けたい
A: Prefab に Collider を追加し、Terrain Settings → Create Tree Colliders にチェック。

Q: 木が風で揺れない
A: Terrain に Wind Zone を追加。SpeedTree シェーダなら自動で揺れます。

編集
Post Share
子ページ

子ページはありません

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