WorldComposition入門
ワールドコンポジション
ワールドコンポジションとは
複数のランドスケープを格子状に並べてオープンワールドで使われるような巨大なマップを構築する機能です。本記事はUE4.25での機能を紹介します。
個々のランドスケープはそれぞれサブレベルとして保存され、カメラとの距離によって自動的にストリーミング(読み込み、破棄)が行われます。
セットアップ
新規レベルの作成
まず新規にパーシスタントレベルを作り保存します。
ワールドコンポジションはパーシスタントレベルが保存されているフォルダ配下を自動検知してサブレベルを探し出します。
そのためワールドコンポジションを使う場合は専用のフォルダを用意したほうがよいでしょう。
今回はMapsにLandscapeフォルダを作り、その中にLandscape_Baseとして保存します。
ワールドコンポジションの有効化
ワールドセッティングの「ワールド>ワールドコンポジションの有効化」にチェックを入れます。
このとき
「ワールドコンポジションは、このレベルが保存されているフォルダをスキャンしてサブレベルを自動検出するが問題ないか?」
という旨の確認が表示されるのでOKを押します。
すると、レベルウィンドウに「ワールドコンポジションを呼び出す」というボタンが追加されます。
このボタンはあとで何度も使うのでよく覚えておいてください。
赤い線は右方向が正のX軸、緑の線は下方向が正のY軸で、中央の矢印マークはエディタ上での現在の視点を表したトップダウンビューになっています。
ビューポート上で視点移動すると矢印マークも移動することが確認できると思います。
最初のサブレベルの作成
ワールドコンポジションは、パーシスタントレベルが保存されたフォルダの配下にあるサブフォルダにサブレベルを配置する設計になっています。
現在、パーシスタントレベルはMaps>Landscapeに保存されているので、ここにSubLevelsというフォルダを作ります。
その中にレベルを新規作成し、名前をLandscape_x00_y00とします。
x00,y00はワールドコンポジション上のグリッド座標を表すようにしました。
x,y両方0なので、原点位置のサブレベルとなります。
レベルを作成すると、レベルウィンドウのサブレベルに今作ったLandscape_x00_y00が自動的に追加されます(追加されてない場合はすべて保存をしたからパーシスタントレベルをリロードしてください)
Landscape_x00_y00をダブルクリックして編集状態にします(自動的にレベルの可視性もONになります)。
次に、ランドスケープモードにしてランドスケープを追加します。
ランドスケープの作成設定で、新規作成、編集レイヤーを有効化にチェックを入れ、マテリアルに適用したいランドスケープマテリアルを指定、他はデフォルトで「作成」を押します。
これでLandscape_x00_y00に500mx500mのランドスケープが作成されました。
最初は真っ暗なのでランドスケープのペイントを選択し
塗りつぶしたいレイヤーのレイヤー情報を選択します。(ない場合は作成してください)
レイヤー情報を設定したら、右クリックしてレイヤーを塗りつぶすをクリックします。
マテリアルが適用されました。
ワールドコンポジションウィンドウにも作成したランドスケープが表示されます。
ランドスケープタイルをドラッグすると位置を移動させることができますが、事故防止のためにこの機能を無効化したい場合は右クリックメニューで「タイルの位置をロック」にチェックを入れておきます。
次に、ランドスケープモードを終了してアウトライナを確認してみてください。
この赤線のLandscape,LandscapeGizmoActiveActor,LevelBoundsの3つのアクターが存在するはずです。
たまにこれらがアウトライナ上に現れないことがあるので、その場合はすべてを保存しLandscape_Baseを開きなおしてください。その際、サブレベルはロードされないので手動でLandscape_x00_y00を読み込んでください(レベルウィンドウ上でサブレベルを右クリックしてロードを選択)
LevelBoundsアクターが存在しない状態で、次のサブレベルの追加を行うとサブレベルが同じ位置に重なって作成されてしまうので注意してください。
サブレベルの追加
最初に作ったサブレベルのタイルの横にさらにサブレベルのタイルを追加します。
ワールドコンポジションウィンドウで、最初に作ったタイルを右クリックし「隣接するランドスケープレベルを追加」を選択します。
-X,+X,-Y,+Yの選択肢が出てくるので、左に作るために-Xを選択します。
保存するサブレベル名を聞かれるので、最初にサブレベルを保存したSubLevelsフォルダを指定して、「Landscape_x-01_y00」という名前で保存します。
これで左側にLandscape_x-01_y00が追加され、レベルウィンドウとワールドコンポジションウィンドウに反映されます。
ここで、アウトライナに再び注目します。
新しく追加した「Landscape_x-01_y00」レベルに、LandscapeStreamingProxyというアクターが追加されています。
この詳細を見ると、Landscape Proxyという項目でLandscapeアクタに「Landscape」アクタが設定されていることが分かります。
これが何の設定かというと、「Landscape_x-01_y00」は自分がロードされたとき、ここで指定したランドスケープを自動的に複製します、という機能を表しています。
ですので「Landscape_x-01_y00」では新規にランドスケープを配置する必要はなく「Landscape_x00_y00」で設置したLandscapeをそのまま使ってスカルプト・ウェイトのペイントを行うことができます。ワールドコンポジションはこの機能があるが故に、複数のサブレベルをまたいで連続的なランドスケープのスカルプト・ペイントが行えるようになっています。
試しにランドスケープのペイントモードで、再度ペイントレイヤーで塗りつぶしてみると
「Landscape_x-01_y00」もウェイトペイントされることがわかります。
2つのタイルを跨いだスカルプトも普通にできます。
注意点として一旦パーシスタントレベルを閉じて再度開きなおすと、サブレベルが全く読み込まれていない状態になります。
単にサブレベルがロードされていないだけなので、レベルウィンドウから読み込みなしてください。
以上でサブレベルの追加は終わりです。
これを繰り返してタイル状に上下左右にサブレベルを広げていけば、オープンワールドで使うような巨大なランドスケープを作成できます。
サブレベルの階層化
サブレベルは、サブレベル同士で親子関係を作ることができます。
先ほど作成したLandscape_x00_y00、Landscape_x-01_y00を例にとると、レベルウィンドウ上でx-01_y00をx_00_y00にドラッグアンドドロップすると、x00_y00がx-01_y00の親になります。
これによりワールドコンポジションウィンドウ上などでx00_y00のタイルを移動させると、x-01_y00のパネルも連動して移動するようになります。
ストリーミングレイヤー
ストリーミングレイヤーとは
ワールドコンポジションのサブレベル=ランドスケープタイルは、視点からの距離によりロード、アンロードする閾値を持っています。
レベルウィンドウのワールドコンポジションボタンを押して、ワールドコンポジションウィンドウを開いてみましょう。
左上に「Uncategorized」と表記されている部分があり、マウスカーソルを合わせると「ストリーミング距離:50,000」と表示されます。
これがストリーミングレイヤーと呼ばれるもので、ストリーミングする距離の閾値を保持しています。
ランドスケープタイルはデフォルトではすべて「Uncategorized」ストリーミングレイヤーに属しています。
ストリーミング距離は50,000なので、各タイルは視点が500m内に入るとロード・可視化され、それ以上離れるとアンロード・非表示になります。
現在のランドスケープタイルは一辺500mなので、この中でプレイする限りは両方とも常にロードされている状態になっています。
ストリーミングレイヤーの追加
ではストリーミングレイヤーを新規に追加してみましょう。
ストリーミング距離を250mに設定したストリーミングレイヤーを作ります。
「+」を押して名前を「250m」、ストリーミング距離を「25000」として、「作成」を押します。
ストリーミングレイヤーの割り当て
作成したストリーミングレイヤーをランドスケープタイルに割り当てます。
ランドスケープタイルを二つ選び(Shiftを押しながら連続して選択か、マウスドラッグで矩形選択)、右クリックメニューを出しレイヤーに割り当てるで250mを選びます。
これで設定完了です。
ランドスケープタイルにマウスをホバーさせると、設定されているストリーミングレイヤーが確認できます。
レイヤー名は250m、ストリーミング距離:25000になっていることが分かります。
実際にゲームプレイで確認してみます。
ランドスケープがロードされたことが分かりやすいようにランドマーク的な高い山を作っておきます(赤い四角形の部分)
プレイヤーのスタートは黄色い丸の部分から始めます。
一辺約500mのランドスケープタイルが横に2枚並んだ状態です。
黄色い丸からもうちょっと右方向に進めば、右側のランドスケープタイルまでの距離が250mを切りロードされるはずです。
プレイ開始すると、まだ高い山は見えていません。
しばらく進んでいくと・・
ストリーミングロードされ山が見えるようになりました。
なお、今回追加したストリーミングレイヤーは1つだけですが、複数追加して、それぞれのタイルに別の設定を割り当てることも可能です。
どこからでも見えるランドマーク的なタイルは遠め、ジャングルなど見通しが悪いタイルは短めといった感じでシチュエーションに応じて使い分けましょう。
ストリーミングレイヤーの割り当て状況確認
ワールドコンポジションウィンドウで、ストリーミングレイヤーのボタンをクリックすると、そのストリーミングレイヤーに割り当てられているタイルが表示されます。
250mをクリックするとタイルは両方とも表示されます。
Uncategorizedをクリックするとタイルは表示は消えます。これは現在Uncategorizedに属しているタイルがないためです。
Ctrlを押しながらストリーミングレイヤーをクリックすると複数選択ができます。この場合、それぞれに属しているタイルがすべて表示されます。
ストリーミングレイヤーの削除
実は、不要になったストリーミングレイヤーを直接実行する方法はないのですが、Uncategorizedを除いてどこにも割り当てられていないストリーミングレイヤーはパーシスタントレベルをリロードしたときに自動的に削除される仕様となっています。
サブレベルへのアクター配置
これについては通常のサブレベルの注意点と同じです。
ワールドコンポジションにより自動的にサブレベルのロード、アンロードが行われるため、そのサブレベルに属しているアクターたちも連動して生成、消去されます。
該当するタイル上に静的な構造物を設置する場合は特に問題になりませんが、タイルを超えて移動するモンスターなどの配置は別管理にしたほうがよいでしょう。