Unity でGame 開発 #5

前回までのユニゲー(Unity でGame 制作)は…

Playerオブジェクトをそれっぽく動かせる(移動できる)ようになった!

ということで、続きます(=゚ω゚)。

ワールド内を移動できるようになったので開発を一歩すすめて、マップ(地形)を作っていきたいと思います。

通常Unityでのマップ(地形)作成はそれ用に用意されたTerrainというオブジェクトをお絵かき感覚で盛り上げたり凹ませたりして作るのですが、マップ作成の才能が皆無っぽい私はプログラムによる自動生成に頼ろうと思います。

※正統なマップ作成のチュートリアルは公式のこの辺を眺めてみるといいかもです。 このあたりhttps://learn.unity.com/tutorial/working-with-the-terrain-editor#

さて自動生成の前にTerrainオブジェクトに関してざっくりと説明。

Terrainはプレーン(平面)meshオブジェクトに地形生成に必要な機能をいろいろとくっつけたオブジェクトです。 地形の表現にはTerrainオブジェクト内のTerrainData内のHeightsデータを使用します。 メッシュ平面(に対応したHeightsデータ)上のpoint(x,y)の高さ(上下軸の数値)を変化させることで平らなメッシュ上に凸凹を作り出します。

point heught

高さデータを保持したheights配列を作ることができればTerrainで地形的な造形ができるということですね。

座標ごとにランダムで高さを設定するのもアリですが、それっぽい造形に近づけるためにUnityに用意されている(かどうかは定かではないが)便利な関数PerlinNoiseを使います。 PerlinNoiseは座標を渡すと対応する0~1の値を返してくれます。

パーリンノイズとは、コンピュータグラフィックスのリアリティを増すために使われるテクスチャ作成技法。擬似乱数的な見た目であるが、同時に細部のスケール感が一定である。このため制御が容易であり、各種スケールのパーリンノイズを数式に入力することで多彩なテクスチャを表現できる。

よく見る画像(2D)で表現するとこんな感じ。 パーリンノイズ

あとは与える座標や返される値を加工して目的の形状に近づけていきます。

座標を拡大、縮小したりー(上の画像を3Dで表現するとこんな感じ)
座標を拡大、縮小

戻り値を増減したりー(単純に何倍、何分の1)
戻り値を増減

開始座標をずらしたりー
開始座標を増減

することで形状に変化をつけます。 ただ、これだけだと単なるなだらかな丘の連続(砂丘ぐらいにしか使えそうにない)か、不自然に凹凸のある地形しかできません(´・ω・`)

そこで次の動画を参考にさせていただきました。 Procedural Planet Generation [Youtube]

動画では球面に成型(メッシュの各座標を基準点から1の距離に設定することで再現)しているけど基本は同じでメッシュの座標をNoiseによって変化させています。

そして変化させたNoiseを複数回(動画ではLayerとして)重ねる(足したり掛けたりする)ことで複雑な形状(地形)を再現しています。

複雑ではあっても基本はサインカーブを利用しているためスケールが違うだけで細部はやはりなだらかな丘になっています。

そこで動画ではサインカーブの絶対値を(マイナス方向への増加をそのままプラス値に)取ることで谷を形成し、その値を反転することで切り立った形状を再現しています。
尖った形状のNoise

適当に数値をいじると
尖った形状のメッシュ
こんな形状がつくれます。

各ノイズをレイヤー的に重ね(合成)ていくことで
レイヤーの合成
いい感じの地形を作っていきます。

長くなるので一旦分割かな(=゚ω゚)ノ