UnityのTerrainで楽して天地創造する

この記事は「mstdn.maud.io Advent Calendar 2021」の6日目の記事となります。遅刻しました。 昨日は出来杉君氏でした。

「はじめに神は天と地とを創造された~」で有名なキリスト教の旧約聖書『創世記』。そこには神が6日間で世界・動植物・人間を創造した様子が描かれています。

しかし昨今では、例えばPCとゲームエンジン(場合によってはお金)さえあれば誰でも天地創造が容易に行える時代となりました。つまり誰でも神になれるのです。すごいな。

もうちょっと冒頭を凝ってみたかったのですが文章力がないので前置きはこれくらいにして、当記事ではUnityとUnity Asset Storeで購入した地形素材系アセットを使い、主にTerrainコンポーネントを使って天地創造を追体験していきます。

創造環境

C#などのスクリプトの記述は不要です。

1日目

新しく3Dプロジェクトを作成します。

い つ も の

天と地ができました。1日目終了です。

明日の仕込みをします。いつものワークスペースが開いたら Fantasy Adventure Environmentアセットをインポートします。

”Window” -> “Package Manager”

Package Managerの上部の Packages: をMy Assetsにすると、Unity Asset Storeで購入したアセット一覧が表示されます。

右下のDownloadを押してしばらく待ちます。進捗バーが100%になってダウンロードが完了したらボタンの文面がImportに変わるので、Importを押してプロジェクトにアセットを取り込みます。

異なる方法で、Free Terrain Stumpsもプロジェクトに取り込みます。

GithubのページからzipをDLしたら、 Terrain-Stamps-master/Assets/ 内にあるTerrain StampsフォルダをUnityのProjectまでドラッグ&ドロップします。

以上で下準備は完了です。

2日目

大地を作ります。空は……後回しです。

Hierarchy画面からTerrainを追加します。

Hierarchyウィンドウで右クリック -> ”3D Object” -> “Terrain”

デケェソムタム Planeのようなオブジェクトが出てきました。

あまりにもデカいので、そこまで広いものを作りたくない場合はTerrainの利用目的に合わせてサイズを調整しましょう。

Terrainコンポーネント内 ”Terrain Settings(歯車のアイコン)”

上の画像の赤で囲ったところの数値を変更します。

次にScene上に木や草花、それとHumanoidキャラクターのプレハブを置いて大きさの調整をします。

上の画像では例として、幽狐族のお姉様(以下、YKK)とFantasy Adventure Environmentの草木などのプレハブを置いて大きさを比較しています。

YKKはデフォルトスケールだとタンポポが腰に来るくらい小さいので、バランスを取るためにYKKのスケールを2.8としました。調整が終わったらYKK以外のプレハブは一旦削除します。(YKKは可愛いので以降スケール確認のために度々参考にするので残しておきましょう)

以降はTerrainオブジェクトに

  • 地形に高低をつける作業(Paint Terrain -> Raise or Lower Terrain 等)
  • 水面を作る作業(Planeメッシュを作ってシェーダーを適用)
  • 地形を岩で固める作業(FAEの岩プレハブを配置していく)
  • 草原や土などの地形を塗る作業(Paint Terrain -> Paint Texture)
  • 地形に植林、または草花を生やす作業(Paint Details、Paint Trees)

をメインにやっていきます。

草原や土などの地形を塗る作業

Terrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Paint Texture”を選択

ここでは、地形の表面にペイントソフト感覚で草や土、砂などのテクスチャを塗っていくことができます。

しかし、初期状態だと塗るものが全くないので追加してあげる必要があります。2通りの方法で登録できます。

どちらの方法も最初にTerrainコンポーネント内、Terrain Layersの”Edit Terrain Layers”を押します。

方法1)Create Layerからテクスチャを指定する

読んで字の如く、Create Layerからテクスチャを指定します。

すると先程まで市松模様だったTerrainが、指定したテクスチャで塗りつぶされることが確認できます。

その後、Terrain Layerの設定を開いてノーマルなどのマップの指定、テクスチャの拡大率等を調整します。

方法2)Add Layerからすでに設定済みのレイヤーを指定する

アセット内にレイヤーのプリセットがある場合、それを指定することで各種設定済みのレイヤーをすぐ追加することができます。

Tips: 拡大率について

Terrain Layerの設定にTiling Settingsがあり、そこでテクスチャの拡大率を調整することができます。

小さい数字であるほど小さくて細かいテクスチャになりますが、テクスチャの繰り返しがだんだん目立つようになってくる、かといって大きすぎると拡大時の粗が目立つようになるので、いい感じの数値に調整しましょう。

x,yがそれぞれ2の場合
8(FAE_Rockのデフォルト)
16

レイヤーをいくつか用意したら、以降はTerrainを塗っていけるようになります。

塗りたいレイヤーを選択して、ブラシの形状・サイズとレイヤーの不透明度を指定してScene上でペイントできます。

普通のブラシで描いていくと、上記画像の一番右のように雑さが目立つので、テクスチャとテクスチャの境界はノイズの効いたブラシで塗って馴染ませると自然な感じになると思います。

思います(希望的観測)

地形に高低をつける作業

Terrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Raise or Lower Terrain”を選択

山岳などの急な高低差の物を作りたい時はTerrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Stamp Terrain”を選択

一定の高さの平坦な地形を作りたい時はTerrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Set Height”を選択

“Raise or Lower Terrain”では、ブラシのテクスチャ(白い部分ほど影響が大きい)を元に地形に高低をつけることができます。

Opacityの値を弄ると影響量を制御できます。また、Shiftを押しながら塗ると低い方向へ影響します(穴が作れます)。

この機能は緩やかな高低向けなので、山などの険しい地形を作りたい場合は “Stamp Terrain” を使います。

Stamp Heightで勾配の調整、Subtractで減算モード(地形を低くする)、Max <–> Addで他の地形と緩やかにブレンドさせる度合いを調整します。

平地の凸凹が激しいのでなめらかにしたい!ってなった場合は “Smooth Height” で地形を平坦化させることができます。

Terrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Smooth Height”を選択

特定の土地だけ決まった高さで平坦化したい!って思う時もあるかもしれません。そんな時は “Set Height” を使います。

Terrainコンポーネント内 ”Paint Terrain(筆のアイコン)” 押下後、下のプルダウンで”Set Height”を選択

Set Heightを使って、指定の高さで平坦化した地形の例

Heightの量で高さを指定、左Shiftを押しながら地形のどこかをクリックすると、そこの高さを参照してHeightの値に反映させることができます。

Tips: 険しい地形はトゥーン調に似合わない?

Free Terrain Brashを使ってStamp Terrainで簡単に山が作れるので、思わず「おおーすげえ!!」と感嘆しそうになりますが、この山は正直高低差が激しく、日本の山で言うと剣岳みたいなものが出来上がります(例えが雑)

例えば自分がBotWや原神などのトゥーンな地形を作りたい!と考えてる時は、一旦これらのゲームを起動してフィールドを観察してみましょう。山にあたるものを見てみても、Stamp Terrainで作った山のようにはとげとげしくないことが分かると思います(もちろんゲームにより表現は異なります)

また、原神の場合、例えばモンドでは高い地形はいくつかあれど、その中でも平地がしっかりと存在し、山よりは崖が大半を占めるように見受けられます。実際にUnityでもそれっぽいものを作ってみて地形はこうやって作るんだなあというのが分かると楽しくなってくると思います。

結構崖が多め
斜めの崖もいくつか存在する模様

Tips: 海用にあらかじめ地形を盛り上げる

Terrainに海などの水域を作りたくなる時があると思います。その際は陸上よりも低い地形を作ってやらないといけないのですが、地形を低くするときに高さ0の状態よりも低くすることはできません。

そして、最初にHierarchyから生成した平らなTerrainは高さが0の状態です。なんの考えもなく山地山地~と地形を作っていると後で海を作ろうとするときに困ってくるので、最初にある程度地形は盛り上げておきましょう。神にも計画性が必要です。

以上をふまえて……

おおもとの地形をさくっと作っちゃいましょう。

高低差は後述する岩のアセットで再現するので、Set Heightでざっくり高低差をつけて目印にしておきます。

水面にしたいところは逆にへこませておきましょう。先述の通り、平地はHeightが20~30になるように作成して、水面用のくぼみが作れるようにしておきます。

水面を作る作業(FAEの場合)

先程作った水面用のくぼみに、Planeオブジェクトを差し込みます。

そして、PlaneのマテリアルをFAE_Waterに変更すると……

これは……水!

みず英: water)とは、化学式 H2O で表される、水素と酸素の化合物である。日本語においては特に湯と対比して用いられ、温度が低く、かつ凝固して氷にはなっていない物を言う。また、液状の物全般を指す。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

水面の色、ツヤ、タイリングなどはFAE_Waterのマテリアルの設定から変えられます。

地形を岩で固める作業

高低差のある所に合わせて岩を配置していきます。

下準備として、FAEのPrefabsフォルダにあるCliffAppearanceプレハブをHierarchyに入れます。

岩の見た目を簡単に変更!

これは何かというと、FAEの岩アセットの見た目をスクリプトを用いて簡単に変えれる機構です。基本の色、ディテール、岩の表面にかぶせるもの(草とか雪とか、TerrainのTextureをオーバーライドする感じ)などを設定できます。当然、FAEの岩にしか作用しません。

あとは地形に合わせて岩を配置していきましょうー

岩などのオブジェクトを配置しまくっているとあっという間にHierarchyが肥大化していくので、適宜親フォルダを作って整理整頓しましょう。

このままだと見た目が浮いてるので、岩の表面にテクスチャをかぶせます。

先程のCliffAppearanceにて、Coverageの項目のAlbedoのところにかぶせたいテクスチャ、Normalsに そのテクスチャのノーマルテクスチャを指定します。AmountとTilingから不透明度やタイリングを設定できます。

このようになります。

ただ、特定の岩にだけかぶせたい!となるときがあると思います。そんな時はCoverage mapを用いて個別にCoverageを設定します。

TerrainにPigment Map Generatorのスクリプトを追加します。

Generateと書かれているでかいボタンを押すとpigment mapが生成されます。TerrainのPaint Textureで塗った通りのテクスチャマップが書き出されると思います。

これをCliffAppearanceに直接使うわけではありませんが、これを目印にしてペイントソフトでCoverage mapを自炊します。

Coverage map を使うと岩ごとにテクスチャを生やす生やさないの設定ができます。3Dテクスチャのラフネスマップのようにグレースケールで塗っていきます。白で塗ってあるところがCoverageされます。

地形に草花を生やす作業

Terrainコンポーネント内 ”Paint Details(花のアイコン)” 押下後、Detailsの項目から生やしたいプレハブを選択

Add Detail Meshから生やしたい草花のプレハブを選択して、Healthy ColorとDry Colorを白にしたら、右下のAddを押します。

WidthやHeightを弄ると高低差のバリエーションが生まれるので、必要に応じて使い分けましょう。

FAEのプレハブでは、草などにLOD(Level of Detailの略:負荷軽減のため、カメラの距離に応じて描画が変化する仕組み)が仕込んであることがあります。その場合、Paint Detailsで塗ることができないので、代わりにPaint Treesを使って塗りましょう。

Terrainコンポーネント内 ”Paint Trees(木のアイコン)” 押下後、Detailsの項目から生やしたいプレハブを選択

プレハブの追加方法はPaint Detailsの時と大体同じです。ただしWidthは弄れず、Heightも別のところから弄る必要があります。

花を置いていると、カメラが引くときにオブジェクトが消えてしまうように感じると思います。これはTerrain Settingsから弄ることができます。

Terrainコンポーネント内 ”Terrain Settings(歯車のアイコン)” 押下後、Tree & Detail Objectsの項目のDetail Distanceを弄る

そうして草花をポンポン置いていき…

そのようになりました。(見栄えのいいとこで撮ってるだけで全体は完成していません)

3日目

空を作ります。

LightingウィンドウのEnviromentの項目からSkybox Materialを指定します。雰囲気に合えば何でも良さそうですが、とりあえずFAE_Skyboxを指定します。

追加したはいいけど……なんか明るすぎない? ということで次は見栄えを整えていきます。

4日目

やっていきをするか…

先程の原神のスクリーンショットのような色合いにしたり、情報量が多くなるようにエフェクトを入れていきます。ほぼFAEの公式ドキュメントを見ながらの作業です

ライティングの調整

まず、HierarchyウィンドウのDirectional Lightを弄ります。

Intensityが1になっている場合、 全体的に暗めの雰囲気になってしまうので、1.2辺りに調整します。

次に、LightingウィンドウのEnviromentの項目から Enviroment Lightingを弄ります。

SourceをColorに、Ambient Colorをグレー気味に設定して(RGBがそれぞれ170前後)、好みの色合いになるように調整します。Skyboxの雰囲気に合わせて少し青みを入れるのもアリです。

フォグの追加

遠景まで鮮明に見えるとゲーム上では安っぽく見えてしまうので、フォグを追加します。

同じく Lightingウィンドウの、Othersの項目からFogにチェックを入れます。

Skyboxの半分より下らへんの色に合わせてフォグのカラーを変更します。色分からん!ってなったらスポイトツールを使いましょう。コイツは作業ウィンドウのあらゆるところから色を参照できるので便利です。

そしてこのままではフォグがTerrainを覆いかぶさりすぎるので、Densityを0.005辺りのめっちゃ小さい数値にします。

いい感じになりましたね。

ポストエフェクトをつける

ここから自分好みの絵を出すために、Unity謹製のPost Processingを設定します。 (Post Processingの導入方法は調べたらたくさん出てくる為割愛します)

FAE側ですでにPostProcessのプロファイルが用意されているので、まずはそれを適用してみます。

薄めの陰影と適切なビネットが追加され、明るい色はBloomで補強され、温かみのあるカラーグレーディングが追加されてだいぶいい感じになってきました!もうこれで完成でいいのでは???

人によっては明るく感じるかもしれないので、Bloomを取り除いたり、Color Gradingを微調整したりしてもいいかもしれません。Saturationをうまく使えばアニメ風の色使いも再現できます。ここら辺はと申します……

自然界のエフェクトで盛る

FAEには地形がもっとファンタジーに見えるように、ホタルやサンシャフト、落ち葉といったエフェクトも用意されています。作ったフィールドに合わせて適宜配置していきましょう。

いい感じに配置したところで、先程スケール確認のために置いていたYKKに何かポーズを取らせて…

それでは皆様ご唱和ください……

Y K K の K

5日目 神はお休みになった。

次回予告

地形を最適化してVRCに持っていくところまでちゃんと書きたかったのですが、記事が滅茶苦茶長くなるしその上アドベントカレンダーに遅刻しており申し訳ないのでこれらは次回に執筆していきます!

それでは皆様も良い天地創造ライフを~!

アドベントカレンダー、明日はdj_gotiusa氏です!

  1. 2019.4.30f1でも恐らく可