シーンを変更する方法

UnrealのレベルシステムはStrixのネットワーク機能から分離されているため、レベルを変更してもStrixのアクター同期には影響しません。

しかし、新しいレベルに移動する際に、以前のレベルに存在していた全てのアクターがUnreal Engineによって自動的に破壊されます。実際のレベル切り替えと他のクライアントからのレプリカを作成するタイミングによっては、レプリカが失われるという問題が起きることがあります。(一時停止 を参照してください。)

この問題を避けるために、以下に示す手順を用いることができます。

一時停止

各クライアントがレベルの切り替えを始める前に、全てのクライアントでPause Network Object Manager関数を呼び出します。これはRPCを利用して行うことができます。例えば、ルームオーナーがSend Rpc To Allを呼び出して一時停止を行います。

その後、全てのクライアントが一時停止したことを確認してから、次の手順(つまり、新しいレベルのオープン)に進みます。これにもRPCを利用することもできますし、カスタムルームメンバープロパティを用いてクライアントが一時停止したことを報告することもできます。

Event graph for level switcher to pause all clients Pause This Client Check if All Clients Are Paused

レベルの変更

全てのクライアントが一時停止したなら、各クライアントは新しいレベルに移動します(普通はOpen Level関数を呼ぶことになるでしょう)。

再びルームオーナーからRPCを送ることもできますし、各クライアントがそれぞれ「全てのクライアントが一時停止したことを確認」のコードを実行してからレベルをオープンするようにしても構いません。

../../_images/level.png

オブジェクトの一時停止を解除

クライアントがレベルのオープンを完了したら、Unpause Network Object Managerを呼び出して、いつも通りのレベルの設定に進みます。アクターの複製と同期を正しく行うという点では、一時停止を解除する際に他のクライアントを待つ必要はありません。(一時停止を解除する前に、何らかの追加処理を行う必要があるかもしれません。レベルの設定処理として、レプリカが邪魔になることやレプリカを破壊してしまうようなことを行う場合などが該当します。また、適切なゲームプレイという点では、新しいレベルでゲームを始める前に、他のクライアントがレベルの設定を完了するまで待つ必要があるかもしれません。)

../../_images/unpause.png

ルームメンバーのレベル

Strix Movement SynchronizerやStrix Transform Syncコンポーネントが行うStrixのアクター同期では、レプリカをオーナーアクターと同じワールド座標に移動させようとします。これらの同期機構は全てのルームメンバーが同じワールドにいるときにのみ機能します。上で紹介した手法で、全てのクライアントが一斉にレベルを切り替えると想定しているのは、このためです。