HDRP:Terrainツリーに自作モデルを使う

☚ 自作オブジェクト(キノコ)をツリーの代わりにTerrain上に散布

かつて、ビルトインレンダーパイプライン(BRP)が隆盛を誇っていた時代、
UnityでTerrainの上に木を生やしたいときには、もともと備わっているTreeCreatorという木の作成機能をつかって、Terrainのツリーを作ったものでした。

しかし今や HDRP においては、TreeCreatorのツリーはもはやサポートされていません。
代わりに有料のSpeedTreeというソフトで作ったツリーがサポートされていますが、SpeedTreeの木を使いたくない理由があったり、あるいは岩などのような、木以外のものを地形上に散布したい場合にはどうすれば良いのでしょうか?

その場合には、自作のモデルをTerrainツリーとして使うことができます。Terrainのツリーには、自作のモデルをアタッチすることもできるのです。

※BlenderからUnityへのFBXモデルのエクスポートについてはこちらも参照

※以下断片的な情報や実験を元にしたものです。しっかり調べたわけではないので間違っている可能性もあります


Terrain Treeとして使えるPrefabの要件

ちゃんとUnity上にモデルがインポートされていれば、そのFBXモデル自体を直接Treeプレハブとしてアタッチすると多分表示はされると思います。
しかし、それだとまともに使えない(後述)ので、アセット化されたFBXメッシュをさらにPrefab化します。

しかしPrefab化する際は
ッシュオブジェクトがPrefabの最上位(ルート)になくてはならない
ので注意してください(でないとTerrain上に何も表示されません)

階層を持ったPrefabでもTerrain Treeとしてアタッチできるようですが、ルートのオブジェクト以外は無視されます。すなわち、Prefabのルート(最上位)オブジェクトがMeshRendererを持っていなくてはいけません。

MeshRendererを持ったメッシュオブジェクト。左の画像のように、これがPrefabの最上位オブジェクトでないとダメ

☚ メッシュオブジェクトの子として追加したキューブも・・・

実際にTerrain上に置いたときには消えています。
ルートオブジェクト以外は無視されるため。

☚ なので逆にこのように、メッシュレンダラーのオブジェクトを他のゲームオブジェクトの子としてしまうと、
Terrain上で何も表示されなくなってしまいます(Kinokoは空のゲームオブジェクト)。

サイズや回転を使うにはLOD Group設定が必要

さて、上の条件をクリアしていれば、自作の3DモデルをTerrain上に出すことができるはずです。

(もし出ない場合、インポート時のサイズが小さすぎたりしないかをチェックしてみてください)

しかし、サイズをランダムに変化させる設定にしたブラシ(左画像)でTerrain上にキノコを並べてみても

ランダムサイズ設定にしてるはずなのに…

できたキノコ群はこれ

右の画像のように、全部同じサイズのキノコが作られてしまいます。おまけに(丸い形なのでわかりづらいですが)回転の向きも全部同じになってしまっています。
これがもし木だったら、見るからに全く同じ木が並んだコピペツリーになってしまいますね。


このままではTerrain上に出せたは良いものの、全然実用的ではありません。

サイズと回転のランダム化設定を適用させるためには、LOD Group コンポーネントを持たせる必要があります。

LOD(Level of Detail)とは、カメラからの距離に応じてポリゴン数の少ないローポリオブジェクトにすり替えたり、さらに遠いオブジェクトについてはカリングする(消す)などして、描画されるポリゴン数やオブジェクト数を間引いて負荷を下げる機能ですが、Terrain Treeでは、LODが設定されたオブジェクトでないと、サイズや回転のランダム化が機能しないらしいのです。

そんなわけで、メッシュオブジェクトにLOD Groupを追加します。

ちゃんとしたLODをしたい場合はもっと多段階にしてローポリモデルなども途中段階に追加するのですが、今回はそこは主眼ではないので、ある程度の距離まで普通に現在のポリゴン数のモデル(LOD 0)を表示させて、それ以上離れたら単に画面から消してしまいます(Culled)。

LOD0を選択した後、Renderers > Add からレンダラーを選択して自身を追加します

PrefabのメッシュオブジェクトにLOD Groupを設定したことで、Terrain上でサイズがちゃんとランダム化されました。

回転も(相変わらず分かりづらいですが)ちゃんとバラバラな向きになっています。