UE4 オープンワールド マップ メモ

 

UE4 オープンワールド マップ メモ

f:id:CrabPunch:20200811174009p:plain

UE4確認バージョン  4.25.3

前書き

 

オープンワールドなゲームにおいて広大なマップを作成したい場合、

そのマップはどのように作るのか、

そのための考察メモ。

 

作成方法

・自動生成型

マインククラフトのように乱数のシードから

地形を自動生成するタイプです。

この手のものだと描画範囲を除き、移動できる範囲が

ほぼ無限に作成することが可能です。

何度も遊べなおせはしますが、

ゲームデザインとしてマップのほうでのユーザーを誘導するなりの

方法がとりにくくなります。

 

・手続き型作成

 

一般的なゲームの作成と作成とおなじように

DCCツールなどで頂点を編集して巨大なマップを作る場合です。

こちらですと、ゲームデザインと組み合わせてユーザーを誘導した

遊びを考慮したマップが作成できます。

 

ただ、昨今の巨大なマップをDCCで1頂点づつ作成するのは

あまりにも非効率な部分があり、いろいろとデメリットもあります。

※詳細は後述

 

・自動生成型+手続き型

下地となる部分や要所要所の部分をある程度

自動生成で意図した形を乱数シードなりで作成できるようにしておきながら

その上で手続き型の部分として整形していくほうほうなども考えられます。

 

今回は手続き型に限った部分のメモとなります。

 

広大なマップの広さとは

フォートナイト  2.3km x 2.3km

Skyrim(15平方マイル) 6.4km x 6.4km

ブレスオブワイルド(28.9平方マイル)   8.6km x 8.6km  

グランドセフトオートV(31平方マイル) 9km x 9km

Xenoblade ChroniclesX(154平方マイル)  20km x 20km

Ghost of Tsushima(274平方マイル) 26.4km x 26.4km

ファイナルファンタジーXV(700平方マイル) 42.3km x 42.3km

 

(Death Strandingはサイズいくつなんだろう、、エリア分れてるし)

 

※参考資料

IGNjapanさんの記事ですとゼルダが827平方kmとありますが

京都市の面積ではそうですが、森などを省いた市街地のみであるなら

海外記事の28平方マイルのほうが正しい気がします

screenrant.com

gigazine.net

jp.ign.com

 

 

頂点密度

広さに続いて、重要なのが頂点密度となります。

仮に40km x 40kmを4頂点で作成したとしたら

フラットな地面であればそれで作成は可能ですが、

マップに起伏などもたせようとすると頂点の分割が必要なってきます。

そこでこの広いマップを何頂点で分割して作成するかが重要になってきます。

1m=1頂点とした場合40km x 40kmだと

40000x40000=1600000000となり

16億頂点のデータが必要となります。

 

仮に頂点情報をシンプルに

座標(x,y,z)  12byte

UV               8byte

の20byteで計算した場合。

 

非圧縮でデータを持つと

320億byte 約30GBとなります。

 

実際にはuvは2-4レイヤー持つかもしれませんし

頂点カラーや頂点法線を持つかもしれません。

もしそうなれば容量がさらに肥大化します。

※実際にはこのような持ち方はしません。 後述

 

上記のように単純計算すると頂点情報だけのマップだけで

容量が膨大となるため

頂点密度を

1m=1頂点とするか

5m=1頂点とするか

20m=1頂点とするか

など密度を調整することによってスケールとあわせて調整する必要があります。

当然、密度をゆるくすればその分地形のディティールは損なわれます。

  

HeightMap

 上記のように頂点情報を生で保持をするとデータ容量が膨大になります。

そのため回避策としてHeightMapを使用します。

要はカラー情報の画像でなく高さ情報だけをもったグレースケール画像

だと思っていただければよいと思います。

 

これは大雑把なベースとなる地形のデータを方眼紙状に頂点を保持し

各頂点を高さ情報のみで表現します。

これにはメリットがいくつかあり

 

・格子状に綺麗に頂点がならんでいる状態のためxとyの情報を

2次元配列前提とした場合 zの値だけで地形を表現できます。

12byteのうち8byteが必要なくなります。

 

・方眼紙状に頂点データをもつことによって

自動でLOD作成できることなどがメリットとなります。

 

・方眼紙状となった地形データは正方形のブロックとなっているので

これを1セグメントなり1セルといったりばらけますが

これを1ブロックとして考えた場合隣接するブロックなどの制御が

お手軽となり、現在プレイヤーが立っているブロックの隣接のブロック

データだけストリーミングをするなどいったことが可能となります。

 

・頂点情報をfloatで仮に保持した場合

巨大なマップな場合遠方へいけばいくほどfloatの精度問題が発生します。

それをブロック単位でoffsetを元に計算をすることによって

この精度問題を回避することができます。

 

 

 

全てのマップが巨大となりますが、それら全てがメモリに乗せることが

厳しい場合があります、また描画においても遠方の頂点の粒度が高くても

必要がない場合があります、そういった観点からもメリットのある手法かと

思います。

 

一方HeightMapでデータを持つことによって生じるデメリットもあります

xy情報が均等に表現されており、高さ情報のzのみですと

オーバーハングな地形や洞窟といった表現が不可能となります。

そういった場合はHeightMapで作成された地形の増えに別のStaticMeshなりを

配置してランドマークなどの表現が必要となってきます。

 

 

 

Landscape + World Composition

実際にUE4上で方眼紙状の巨大な地形を作成するには

Landscapeという機能が用意されています。

docs.unrealengine.com

 

okawari-hakumai.hatenablog.com

 

デフォルトで作成すると

505x505頂点のLandscapeが作成できます。

1Landscapeの最大サイズが8161x8161となります。

f:id:CrabPunch:20200810135630p:plain


f:id:CrabPunch:20200810131437p:plain


docs.unrealengine.com

 

Landscapeをlevelに作成した後

それらのlevelをWorldCompositionにてそれらの配置を整理して

結合、ストリーミング距離、LOD設定、レイヤー設定などができます。

WorldComposition上では別のsublevelの作成と結合や

ドラッグなどによってLandscapeが配置されているlevelを動かして

位置の調整などもできます。

f:id:CrabPunch:20200810135852p:plain

 

 

 

容量

容量の問題について

新規でThirdPersonマップを作成した場合マップの容量は以下のようになります。

f:id:CrabPunch:20200810140432p:plain

この状態からいくつか余分なものを削除しライトを動的として余分なライトマップやシャドウマップがない状態とします。

f:id:CrabPunch:20200810140552p:plain

ここでLandscapeのデフォルトサイズの505x505を作成したとします。

 

f:id:CrabPunch:20200810140656p:plain

 

 

f:id:CrabPunch:20200810140721p:plain

 ここでLandscapeのデフォルトサイズの8161x8161を作成したとします。

 

f:id:CrabPunch:20200810141024p:plain

f:id:CrabPunch:20200810141034p:plain

上記からLandscapeのサイズは

255025頂点 8993KB

66601921頂点 143022KB

 

差分の容量が

66346896頂点 134029KB

となります。

1頂点約2byteとなります。

高さの情報を2byteで保持していることがわかります。

 

8km x 8kmのサイズのLandscapeを作成して139MBとなります。

ただ、これはシンプルな頂点情報だけとなります。

 

この状態でパッケージをしてCookデータを確認します。

f:id:CrabPunch:20200810150740p:plain

これで容量は約600MBとなります。

 

ここまでは動的ライトでマップを作成していましたが

これを変更して静的ライトにしライトビルドをします。

 

これによってマップのライトマップとシャドウマップも含まれるようになります。

今回は小物などもおかず、ライトのクオリティもデフォルト設定のままで

ベイクします。

 

ライトビルド後のCookサイズを確認します

f:id:CrabPunch:20200810151112p:plain

ライト情報ありですと1.10GBとなります。

かなり大雑把となりますが8km x 8kmだと最低でも1.10GBということになります。

(ライト関連の設定をけづればここから600MBの間への多少の削減は可能かと思います。)

 

8km x 8kmでこのサイズとなると

仮に40km x 40kmの場合ですと25倍となるので

27.5GBがパッケージサイズで必要ということになります。

 

以下、再度各種参考例の容量を確認します。

※マップ容量はあくまでゲームの要素の一部なので他にも別のTexture容量や

サウンドやムービーなども含まれるので一概にマップ容量は判断はできません

 

フォートナイト  2.3km x 2.3km 82GB

Skyrim(15平方マイル) 6.4km x 6.4km 6GB

ブレスオブワイルド(28.9平方マイル)   8.6km x 8.6km 13.5GB

グランドセフトオートV(31平方マイル) 9km x 9km   65GB

Xenoblade ChroniclesX(154平方マイル)  20km x 20km 23GB

ファイナルファンタジーXV(700平方マイル) 42.3km x 42.3km 74~95GB

 

パッケージのゲームですとなかなかの容量がかかります。

昨今の通信速度を考えるとローカルでデータをもたずにサーバーから

地形形状データを取得してから作成するという流れもありえるかもしれません。

もしくはクラウドサーバー側ーだけで完結してレンダリングだけ

転送でもういいのかもしれませんが。

 

 

 

Landscapeの整形

f:id:CrabPunch:20200810162355p:plain

UE4のLandscapeでのスカルプトツールにて

マップを整形していってもいいのですが、

広大な面積をこれだけでやるのはかなり苦労します。

全てを手作業でやろうとするのはやめましょう。

Landscapeは作成時にHeightMapイメージを取り込めるので

ある程度HeightMapにてマップ形状のあたりをつけてから

それを取り込んだのちに、スカルプトツールなりで調整するのが

よいかと思われます。

 

 巨大なHeightMap作成には

Maya Terragen WorldMachine WorldCreatorなど

いろいろツールがあります、ここで紹介したもの以外もあります。

 これらのツールはノードによって計算してプロシージャルに地形の作成などができ

そこからHeightMapを出力することが可能です。

 

参考資料

www.youtube.com

 

www.youtube.com

 

これらを利用してある程度 意図したとおりの形状を作成し

HeightMapを出力します。

f:id:CrabPunch:20200811101132p:plain

 

UE4上でのHeightMapの取り込みは

Landscape作成時にファイルからインポート

にてHeightMapを指定できます。

f:id:CrabPunch:20200811101536p:plain

 

 

 

 

HeightMapの分割取り込み

HeightMapの出力に関して出力すると

巨大な画像ファイルになってしまいます。

8k x 8kピクセルの画像の処理などであれどPCのメモリなどは

それなりにもっていかれます。

またさらに広大なHeightMapを作成する場合だと

8k x 8kなどではサイズが足りない場合があります。

現状UE4では標準設定のままだと8k以上の画像取り込み

は一部問題などがあるので画像のサイズは最大でも8kあたりにとどめておくのが

よいかと思います。

 

では、8k以上のHeightMapとどのように取り込むかとなると

上記で紹介したツールなどでもできるのですが

HeightMapをタイル状に分割出力することが可能です。

 

タイル状に分割されたHeightMapは

UE4上のWorldCompositionでファイルの命名規則によって

取り込りこむ機能があります。

f:id:CrabPunch:20200811104615p:plain

f:id:CrabPunch:20200811104638p:plain

まとめてタイル化されたHeightMapをこうして読み込めます。

読み込まれたHeightMapはSubLevel化され、命名規則にのっとり

自動配置されます。

f:id:CrabPunch:20200811104715p:plain

注意点として命名規則以外にHeightMapの画像サイズは

UE4 のRecommended Landscape Sizeのみとなります。

8129x8129

4033x4033

2017x2017

1009x1009

505x505

253x253

127x127

Landscape Technical Guide | Unreal Engine Documentation

Landscape Material

 LandscapeのMaterialを作成するにあたり

MaterialでレイヤーをもちそれらをWeightをペイントで調整することによって

Materialを塗り分けることができます。

docs.unrealengine.com

 

f:id:CrabPunch:20200811142022p:plain

全てを手作業でやろうとするのはやめましょう。

全てを手作業でやるにはマップが広大で時間がかかりすぎる上に、

変更に弱くなります。

自然地形のMaterialであれば

地面の傾斜角や高度などを元に大雑把にMaterialを塗り分けるほうが

お勧めです。

それらの後に調整用としてペイントするなどが良いかと思われます。

例えば水平面であれば草Materialにし傾斜角が一定以上であれば

土や砂のMaterialにする、高度が一定以上のばあいは雪のMaterialに

するなど。

 

※参考資料

www.youtube.com

 

 

 

 

 

 

Landscape Foliage

UE4では草木や石など配置するためのFoliage機能があります。

docs.unrealengine.com

草や木のアセットをいくつか組みあせたものを登録しておき、

それをペイントブラシにて地形に配置などができますが、

全てを手作業でやろうとするのはやめましょう。

こちらはMaterialと同様にMaterial依存で草木を生やすことができます。

また傾斜角に合わせたり高度に合わせての調整なども可能です。

それらで大雑把にあたりをつけたのちに

調整としてペイントなどを使用しましょう。

※参考資料

www.youtube.com

docs.unrealengine.com

またプロシージャルだけではコンセプトに対して制御しづらい場合などは

TextureMaskなどを使用してある程度の群生の制御も可能です。

 

f:id:CrabPunch:20200811154729p:plain

 docs.unrealengine.com

 

 

 

おまけ

 Landscape Auto Material

ここまでのマテリアルと配置のMarketplaceのアセットもあります。

www.youtube.com

 

 SpeedTree

FoliageのおまけとしてUE4ではなく外部ツールとなりますが

SpeedTreeというものがあります。

こちらは草や木などをプロシージャルに生成できるものです。

またこれらはランタイムでの生成も可能なので動的変更などにも便利だったりします。

他にも近景であればフルポリゴンで生成され中間距離であれば幹や枝の部分が

一部スプライトになったLODの生成などもしてくれます。さらに遠景であれば

ビルボードスプライトも生成してくれます。

このデータをUE4で使用できるプラグインも存在しています。

store.speedtree.com

docs.unrealengine.com

後書き

今回は長めのメモとなってしまいました。

また、他にもLandscapeでの隣接する部分のMaterialブレンド

法線、ライティング問題など書くことはありそうなのですが

気が向いたら書きます

(可能性は微粒子レベルで存在しているかもしれない)