お世話になっております。
現在のレベルを再度読み込みなおすという処理を行なう場合がありUGameplayStatics::OpenLevel()関数で行なっておりますが、十数秒の時間が掛かってしまい何とか短縮する方法が無いか調査しております。
オフラインプレイのゲームのためAGameModeBaseを使用しており、AGameMode::RestartGame()を使うことも出来ません。
このような同じレベルをやり直したい場合に有効な方法は御座いますでしょうか?
お世話になっております。
現在のレベルを再度読み込みなおすという処理を行なう場合がありUGameplayStatics::OpenLevel()関数で行なっておりますが、十数秒の時間が掛かってしまい何とか短縮する方法が無いか調査しております。
オフラインプレイのゲームのためAGameModeBaseを使用しており、AGameMode::RestartGame()を使うことも出来ません。
このような同じレベルをやり直したい場合に有効な方法は御座いますでしょうか?
OpenLevelでは、Levelのデータの破棄とその後再ロードが走るため、どうしても時間がかかってしまいます。対策としてましては、レベルに紐付かない常駐データとして共有オブジェクトを保持しておく方法が良いかとは思います。永続的なデータの保持は以下のブログなどがご参考になるかと思われます。
ご参考になれば幸いです。
お世話になっております。
ResetLevelというコンソールコマンドもあります。現在のレベルを最初の状態に戻したい場合は、それは聞くけど、各プロジェクトで何をリセットする必要があるか異なりますので、こういう実装はプロジェクト側の方が向いています。ResetLevelはすべてをリセットしますので、あるコードを再度実行するやあるアセットをリロードするかもしれませんが、プロジェクト側で何をリロード・リセットするべきしないべき判断出来ますので、もっと最適化のリセットする方法を実装するのは可能です。エンジン側で、一般的なケースしか対応出来ないので、ResetLevel以上の実装はEngine側の対象外になります。
よろしくお願いします。
ご返答ありがとうございます。
既にゲーム全体を通して使用するデータ等は永続的データとして保持しております。
背景モデルなどゲームプレイ中に変化の無いものは残し、AIキャラやマップギミック等ゲームプレイによって変化するもののみをリロードできれば良いのですが、
サブレベル単位での解放&再ロードでは、操作しないサブレベルに配置されたアクターのBeginPlay()が呼び出されないため、BeginPlay()でなんらかの初期化処理を行なっている場合に問題が発生してしまいます。
そのためOpenLevel()でのリロードを已む無く行なっている状況です。
もし上記の問題を解決できる方法が御座いましたらご教授いただけると助かります。
残念ながら、ロード時の初期データなどをそのまま保持していたりしていないため、OpenLevelによりもとに戻したい部分を再ロードしない限りそのような対応はできないかと思われます。
私の知る他社さまの事例では、OpenLevel()を使わずにゲームをそのレベルの初期状態に論理的にリセットする機能をゲーム仕様に沿って独自に作成して対応しておりました。
承知いたしました。
独自実装を検討してみます。
情報ありがとうございます。
ResetLevelを試したうえで必要に応じて独自実装を検討します。