リセット機能の作り方
妹「OpenLevelつかってリセットできるようにして、あとゲームが終わったときもこれで戻るんだけど、なんか読み込みに結構時間がかかって、その間についマウスをカチカチクリックしてタイトル飛ばしてしまうんだけど、これもっと速くできないもんかな?」
「兄のパソコンでやるとそんなに時間かからないなあ……1秒かからないぐらい」
妹「えー……」
「RestartGameっていうノードもあるけど、これも速度としてはOpenLevelと同じぐらいのような」
妹「パソコンを速くするしかないんだろか」
「容量の都合でハードディスクに置いてるのがあれだったかも。ただどうしても時間がかかることはある。レベルの規模が大きくなれば特に。クリック誤爆の問題だけなら、Gateノードとか置いて、開始直後をクリックを無視するという手もあるけど」
historia.co.jp
unrealengine.hatenablog.com
「いくつかのレベル(サブレベル)に分けるという手もある。背景とキャラクターとを別のレベルにして、キャラクターの方だけ読み直せば、時間短縮になるはず。ただ兄はこの方法使ったことないからよくわかんないけど」
妹「じゃあ兄は腕立て伏せのやつでどうやってリセットしてるの?」
「あれは強制腕立て伏せ機の位置を元に戻して、時間と得点を初期値に戻してるだけだね」
「BeginPlayは最初に1回だけで、ゲームをやり直すたびに設定する部分は別のカスタムイベントに分けてある。2回目以降だけゲーム終了時のウィジェットを消す処理があるけど、今考えるとこれはパラメータの初期化別イベントにした方がわかりやすかったけど」
妹「元の場所に戻すといっても、たくさんあると大変だよね……色々スポーンさせたりするし」
「BeginPlayの時点でポジションを変数に記録して、それをあとで呼び出すとか。初期化で消滅させるアクターにタグを設定しておいてGetAllActorsWithTagで一気にDestroyするとか」
妹「最初からあるけど、あとで消えちゃうやつは? なくなっちゃったらもうGetできないわけだし」
「アクターの中じゃなくて、GameModeとかの別の場所の配列にでも位置を保存しておいて、その場所にスポーンしなおすという手がある。あとはDestroyせずに非表示にしてどっか遠くに移動させるとかも。元の位置に戻して表示すればOK。まあでも複雑なゲームだとむずかしいね」
妹「兄はどうしてそういうリセット方法にしたの? もっと速くしたかったとか?」
「どうしてというか、RestartGameとかOpenLevelとかでリセットできるのを完全に忘れてたから……」