一時停止

Strixでは、アクターの複製は自動的に行われます。ルームに参加している間は、Strix Replicatorコンポーネントを持つアクターを作成(スポーン)するたびに、そのレプリカが、同じルームにいる他の全てのクライアント上で自動的に作成されます。他のクライアントがアクターを作成した場合も同様で、こちらのクライアントにレプリカが作成されることになります。また、オリジナルのアクターが破壊されると、レプリカも破壊されます。その背後では、そのようなアクター全てを追跡するために、ルームサーバーによってネットワークオブジェクトと呼ばれるオブジェクトが管理されており、これも適切に作成されたり破壊されたりしています。Strix内部のクライアント側コンポーネントであるネットワークオブジェクトマネージャーが、その処理を担当しています。

自動的に複製を行うこの仕組みは普通はうまく動作しますが、この自動処理を一時的に無効にしたい場合もあるかもしれません。

関数

Strixの複製機能は、以下に示す3つのブループリント関数を用いて一時停止したり解除したりできます。

また、ルームに参加するStrixの関数には(ルームを作成してそこに参加する関数にも)Pause Network Objectsという名前の引数があります。これをTrueに設定すると、ルームに参加した直後に、何らかの他の処理が行われる前に、複製を一時停止します。これは、参加の関数の成功コールバックが実行されるよりも先に行われます。

一時停止

関数Pause Network Object Managerは複製を一時停止します。新しいネットワークオブジェクトは一時停止状態で作成され、レプリカアクターをスポーンしません。

一時停止の解除

関数Unpause Network Object Managerは複製の一時停止を解除します。一時停止状態であったネットワークオブジェクトは、レプリカアクターを作成します。一時停止後にアクターが破棄されたレプリカがあれば、それらのアクターが再作成されます。

状態の確認

ネットワークオブジェクトマネージャーが一時停止している場合、Is Network Object Manager Paused関数はtrueを返します。

注釈

  • 一時停止しても、新しいアクターが他のクライアントに複製することは止まりません。レプリカアクターの実際のスポーンが起きなくなるのみです。一時停止を解除すると、新しいレプリカが作成されます。

  • 一時停止はStrixのネットワークオブジェクトの複製にのみ関連し、他のゲームロジックには一切影響しません。ネットワークオブジェクトマネージャーを一時停止している間も、ブループリント関数は通常通り動作します。

  • 3つの関数はどれもチャネルIDを引数として受け取ります。これは、一時停止の効果がそのチャネルに作用するということを意味します。あるチャネルを一時停止しても、他のチャネルでのアクターの複製は停止しません。

注釈

この機能はまだ実験段階です。アクターを適切にクリーンアップしている場合にのみ使用してください。主なユースケースは以下に示す通りです。

ユースケース

レベルの切り替え

一時停止の典型的なユースケースは、インゲームの途中で新しいレベルに切り替える場面です。

ゲームアプリケーションがレベル遷移を同時に起こそうとしても、実際のタイミングはクライアントごとに違ってしまいます。Strix Replicatorの通常の動作は、レベル切り替え処理の途中であっても、常にアクターのスポーンや破壊を同期し続けます。クライアントが新しいレベルでアクターの複製を開始したときに、別のクライアントはまだ以前のレベルのままかもしれず、自分よりも速いクライアントからの新しいレベル用のレプリカを以前のレベルにスポーンしてしまう可能性があります。それらのレプリカは、遅いクライアントがOpen Level関数を実行したときにUnreal Engineによって破壊されてしまいます。

この事象を防ぐために、いずれかのクライアントが切り替えを始める前に全てのクライアントで複製を一時停止し、切り替え終えた後で全てのクライアントが一時停止を解除することができます。

詳しくはシーンを変更する方法を参照してください。

インゲーム用のルームへの参加

インゲームレベル用のルームへ参加する際にも一時停止が必要になる場合があります。

クライアントがルームに参加するとすぐに、そのクライアント上でネットワークオブジェクトマネージャーが動作を開始します。その結果、ルームに参加した後に必要な各種の初期設定が終わらないうちに、ネットワークマネージャーが他のクライアントからのレプリカをスポーンし始めるかもしれません。これは特に、進行中のマルチプレイヤーゲームに途中参加する際に起こります。

Join Node Roomのような関数の成功コールバックでUnpause Network Object Managerを呼んでも手遅れになる可能性があります。実際のルームへの参加と成功コールバックの実行の間にはある程度の遅延があり、その遅延の間に複製が始まってしまうかもしれないからです。

この問題を避けるため、Join Node Room関数を呼び出す際にPause Network Objects引数をTrueに設定することができます。そうした場合には、初期化が終わった後でUnpause Network Object Managerを呼ぶ必要があります。