| この記事の要点 |
|
Terrain の基礎
Unity Terrain は地形 (Height Map) + テクスチャ + 木 + 草 + 風 + Lightmap UV をまとめて扱える専用システムです。木は Terrain の機能の一部として植えられます。
- Hierarchy → 3D Object → Terrain を作成
- Terrain Inspector のツールバーで 木のアイコン (Paint Trees) を選択
- Edit Trees → Add Tree で木の Prefab を登録
- Terrain 上をクリック / ドラッグで植える
Paint Trees の主要パラメータ
| パラメータ | 意味 |
|---|---|
| Brush Size | 1 回クリックで影響を及ぼす円の半径 |
| Tree Density | ブラシ内に配置する木の密度 |
| Tree Height | 木の高さスケール (Random Range 推奨) |
| Lock Width to Height | 高さに合わせて幅も比例 |
| Random Tree Rotation | Y 軸ランダム回転 (同じ木が一様に見えるのを防ぐ) |
| Color Variation | 葉色のランダム差 |
木の Prefab を入手する
| 入手元 | 内容 | 備考 |
|---|---|---|
| Asset Store | 無料 / 有料の木 Prefab 多数 | 「tree」「foliage」で検索 |
| HDRP / URP Terrain Sample | 公式サンプルに含まれる | Package Manager から |
| SpeedTree | LOD 付きの本格樹木 | 有料 / Subscription |
| Polygonal Tree Pack | ローポリ向け | モバイル / Switch 向け |
Mass Place Trees (大量配置)
森全体を一気に作りたい時に便利な機能です。
- Paint Trees ツール内の右上メニュー Mass Place Trees
- Number of Trees に植えたい本数 (例: 5000)
- Keep Existing Trees にチェックを入れると追加配置、外すと置換
- OK で全 Terrain にランダム配置
その後、欠落地帯を Paint Trees ツールで手動補正します。
個別の木を削除
- Shift + ドラッグ: ブラシ範囲の木を削除
- Ctrl + ドラッグ: 選択した種類の木だけを削除
Detail (草) を植える
木と同じ Terrain ツールバーの 花アイコン (Paint Details) から草や小石を植えられます。
| Detail Type | 用途 | 負荷 |
|---|---|---|
| Grass Texture (Billboard) | カメラに常に向く 2D 草 | 軽い |
| Detail Mesh | 3D メッシュ (石 / きのこ等) | 中 |
| 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<TreeInstance>();
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 シェーダなら自動で揺れます。
子ページ
子ページはありません
同階層のページ
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09