Unity TerrainToolsを使用してペイントソフトで作った2Dマップから3D地形へ
はじめに
UnityにはTerrainToolsというスカルプティングの要領で地形生成を行うツールがあります。
UnityのTerrainはHightMap(ハイトマップ)という白黒の値(0~255)で高さを表現した図を使ってUnity上で3D描画をしています。
つまり、白黒の画像だけでUnity上で地形が作れるということになります。
この性質を生かし、以下のUnityJapan公式で作成した動画ではTerrainToolsで大まかな地形の形を作り、白黒のHightMapとして出力後、その画像を加工して、より快適にディティールアップを目指したものを作っております。
そして、出力もできれば取り込みもできるということで、TerrainToolboxという拡張機能により白黒のpng画像から地形を生成することができるようになっています。
今回はこれをうまく活用し、ペイントソフト上で2Dで計画したマップをUnityに取り込み3D地形にする方法を考えつきましたので、普段Unityで開発されている皆様へ共有できればと思います。
今回の目的
・UnityTerrainToolboxを使用し、ペイントソフトで計画して作った2Dマップから自動で3D地形の生成を行います。
・3Dで地形計画を練ったり、スカルプティングで地形を1から整える作業は大変なのでペイントソフトでお絵かきするだけである程度の地形を自動的作ろうというのが狙いです。
・取り込んだ後に通路の設定や拡幅をする必要があるので、それについてはUnity上で行います。
・上の画像では木や草のアセットの配置をプログラムで加工した画像をもとに生成していますがここではしません。(もちろんここで生成した3D地形を出力して加工という手順を踏み再度Unityに取り込むという流れを使ってもよい)
やり方
1.UnityTerrainToolboxの機能を有効化する。
以下のYoutubeを参考にTerrainToolboxを有効化してください。(0:30~1:30)
私の場合はすでにインストールされていたようでこの作業は必要ありませんでした。
2.マップの計画を練り白黒で2Dマップを作成
次にペイントソフト(Paint.NETを使用していますがどんなペイントツールでもついている機能を使うのでなんでもよい)を使用してマップの計画を練ります。
私の場合このようなマップを作りました。
そして計画を済ませたらこれをもとにちゃんとしたマップを白黒の値で書きます。
この白黒の値は白が一番高い値、黒が一番低い値になります。
下のようになりました。ステージは一番低いところでその周りを灰色にして盛って区別しているというようなイメージです。
ファンタジーとかに出てきそうなマップになりましたね。
3.この状態でUnityに取り込んでみる。
一応確認のためこの状態でUnityに取り込んでみます。(この作業はあくまで確認なので必要ありません)
まずマップの画像を正方形のサイズにしてpng形式で保存します。(サイズが正方形でないと生成ができないようなので気を付けてください。)
次にUnityEditorを開き保存した画像をプロジェクトビューにドラッグ&ドロップをして取り込みます。
そして「Window」→「Terrain」→「Terrain Toolbox」からツールを開きます。
Generalの項目ではTerrainの縦、横、高さを設定するので、任意の数字を入力しましょう。
InportHightmapのTextureに取り込んだ2Dマップをドラッグ&ドロップで適応します。
それ以降の設定はあまり関係ないため飛ばし、一番下に「Create」ボタンがあるのでそれをクリックすると3D地形が自動生成されました。
良い感じに地形が自動生成されてます!成功です。
4.2Dマップに高さ情報を入れる
簡単なゲームならこれで充分だと思いますが、よりリッチにしたいためこのマップのステージごとに高さをつけて起伏のあるマップにしていきます。
UnityEditor上でスカルプティングして作るのもよいですが、2Dで制作した方が簡単だと思ったため、もう一度ペイントソフトに戻り、画像に高さ情報を入力していきます。
ペイントソフトで高さ情報を白黒の値(0~255)で入力していきます。
ステージごとに〇〇mの差があるかを計画し、それにあった値を入力します。
例えば最高峰の山が255mだと仮定し、最上部ステージはそこから30m下の場所に作成しようとする場合、山の頂上を白(255)として最上部ステージは白身の強い灰色(225)、その下のステージは10m下がって(215)などのようにして、投げ縄ツールや魔法の杖ツールを使用して一気に同色で塗っていきます。
先ほどの2D画像に高さ情報をつけたものが以下になります。
先ほどの画像と比べわかりづらくはなりましたが、作っているうちは場所を決めて色を塗ってという流れでやっていくのであまり問題になりません。
また、計画した地形は最終的に255~100の値までしか使わなかったので、画像をレベル調整し、255を255、100を0に保管してこの画像を調整しています。
5.Unityに取り込んで3D地形の生成
3と同様に上のレベリングした画像をUnityに取り込み「TerrainToolbox」から3D地形を生成します。
ここで少し気を付けたのが、レベル調整をした分高さを適正にして取り込まないといけないということです。
2Dの高さが100~255の値で155の高低差があるので、Generalの高さを155と指定することで、値が1上がると1mにというように調整できます。(値が1上がると2m上げたい場合は高さを310と指定する)
出来上がったのがこの地形になります。
かなり面白そうな起伏のある地形が一瞬で生成できています。
これを使うとかなり効率化できそうですね。
6.地形の調整をする。
生成された地形ですが、ステージごとの境目の色の差が激しいため、崖のようになっています。道がない状態です。
ステージ同士をつなぐ道を作りたいのですが、これについてはUnityのTerrainToolsを使用した方が快適に作業できます。
下の画像のようにTerrainToolsの「Script」→「Bridge」ツールを使用することで、Ctrl+ClickとClickで2点間をつないだ道を簡単に作ることができます。
その他SmoothHightなどを使って地形をならしたりして、快適な地形を作っていきます。
完成した地形を歩き回ってみました。
これに木や草のアセットなどをどんどん配置していくと地形の完成となります。
小ネタ
白黒画像だけで地形が生成できるということでネタで以下のような動画も作ってみました。
Unityへの画像の取り込み方の参考にもなるかと思います。
さいごに
UnityTerrainToolboxを使うと3D地形の生成がめちゃくちゃ効率的になります。
UnityTerrainToolsはスカルプティングの要領でブラシの強さを変えたり、ブラシの大きさを変えたりなどいろいろ設定をしながら作っていかなければならないため非常に大変です。
今回のようにある程度のマップを2Dで制作できるのは大きな利点だといえます。
2DメインでUnityを触っている人にも2Dの流れから3Dに簡単に移行できるので、少しでも触っていただければと思います。
※上で上げているマップの画像だったりレベリングした画像だったりは無断で使ってもらっても構いません。