Level Streaming完全に理解した(わかってない)

今作っているゲームのアルファ版ではロード画面の制御にマーケットプレイスで売っていたブループリントを使っていたのですが、バトルとかイベントの部屋はサブレベルにすれば管理が楽だなぁなどと思っていて、マケプレで買ってきたやつはドキュメントも英語だからよくわからないなぁと思っていて、やはりレベルストリーミングとかちゃんと覚えて自分で作ってみよう!と勉強しなおしました。

やりたいことは

・マップ移動の時Now Loadingを入れたい

・作戦中のマップを『フィールド』『バトルフィールド』『イベント部屋』『ボス部屋』などをサブレベルで分け、作戦ごとに必要なものを入れ替えパッキングしたマップを作りたい。

・GameModeは作戦に入ったら(Loadしたら)クリア状態にしたい。

というわけで…
ネットでは「ロード画面を入れるにはどうしたらよいですか?」的な質問に
「マップは全部サブレベルで管理してサブレベルを読んでるときにパーシスタントレベルでロード画面を出すのがよい」的な回答をよく見かけるのですが…、
やっぱり【待機場所マップ】⇔【本チャンゲームマップ】の行き来はキレイさっぱりOpenLevelしたい!ということで

【本チャンゲームマップ】には
パーシスタントレベルに「ロード画面ウィジェット」
サブレベルに「本チャンゲームマップ」
を置いて
パーシスタントレベルのBegin Playにロード画面を表示してから本チャンマップを読み込む
という形をとって、【待機場所マップ】からOpenLevelで【本チャンゲームマップ】を読み込む方法を試してみました。

具体的には
TPSテンプレートを作り、そこにデカめのマップ(ここではSoul:City)を入れて

パーシスタントレベルにロード画面
サブレベルにSoul:City
を入れた【LoadAndMap】レベルを作り、待機場所マップから【LoadAndMap】をOpenLevelしてロード画面からの~Soul:Cityをがうまく動くかやってみました。

うまくいけばNowLoadingで待たされてSoul:Cityにつながるはずですが、懸念点はこの方法だと最初のNowLoadingが出るまでも微妙に時間がかかっちゃってロード画面の意味をなさない可能性があるということで…


一応、詳細な説明を。
まず下準備としてTPSテンプレートを新規で作り、ランチャーに戻って無料配布されているSoul:CityをTPSテンプレートに追加
(ちなみにSoul:City、デカいと思ったけど全然重くなかった。Epic凄い!)

ThirdPersonExsampleMapのワールドセッティングのGameMode Overrideの所を念のためThirdPersonGameModeにしておく

Soul:Cityのマップの「LV_Soul_Slum」を開いてしばしシェーダーのコンパイルを待ち、プレイヤースタートを消してThirdPersonCharacterをコピペする。
しなくてもOKですがこのままでは主観視点で始まるので一応合わせるために…
ワールドセッティングのGameMode OverrideもThirdPersonGameModeにしておく。

保存したら「空のレベル」を作り、ウィンドウ→レベルを開いてそのウィンドウに保存した「LV_Soul_Slum」を放り込む。
「LV_Soul_Slum」を右クリックして「ストリーミング方法を変更」を「ブループリント」に。



次に、ロード画面をウィジェットで適当にでっちあげる。


次に、レベルブループリント(サブレベルの方ではない)を開いてBeginPlayにロード画面をCreateWidgetしてAddtoViewport、そのあとにLoadStreamLevelで「LV_Soul_Slum」を読み込ませる。
(ここではフェードアウトも何も挟まなかったのでLoadStreamLevelではMakeVisibleAfterLoadにチェックを入れてロード完了後にすぐ表示されるようにしました)

あと、サブレベルのレベルブルプリントのBeginPlayにRemoveAllWidgetを入れとくとロード画面が消えてくれます。

あとは「空のレベル」を名前を付けて保存。(ここでは【LoadAndMap】にしました)

これでほぼ完成。

あとは【ThirdPersonExsampleMap】と【LoadAndMap】を良きにOpenLevelするだけです。
ここではテストなので【ThirdPersonExsampleMap】のレベルブループリントでMを押したら【LoadAndMap】をOpenLevelするだけにしました。


エディター上でテストすると1回目はいい感じにLoad画面が出てしばらくしてからSoul:Cityが表示されますが、何度も行き来してるとキャッシュに残ってて一瞬でロード完了します。
実際パッケージ化したらどんな感じの挙動になっているのかやってみたところ、今回書いたやり方でも割とロード画面として機能している感じでした。

ただし、本当にいい感じのやり方は上でも書いてある通り【ThirdPersonExsampleMap】と【LV_Soul_Slum】をサブレベルに置いてレベルストリーミング中にパーシスタントレベルでロード画面を表示するのが正解なんでしょうね。

サブレベルなんだか怖い…と思ってましたが、いつもの通り普通にマップを作りレベルを保存しておいて、新たに「空のマップ」でレベルウィンドウを開いてそいつをサブレベルとして放り込むだけで、普通に作ったのと同じように動くんですね!
サブレベル怖くない。
ただし!!!
ナビメッシュは注意が必要です!!
ナビメッシュはパーシスタントレベルか「常にロード」されているサブレベルでしか機能しないようで、上でやった「ストリーミング方法の変更」を「ブループリント」にしているとアウトです。
私はドーンとデカいナビメッシュをパーシスタントレベルに置いておく方法にしました。

コメント

このブログの人気の投稿

フィールド⇔バトルについて

最低限のサウンド再生について