複製

Strixで接続がどのように機能するのかを理解したところで、Strixが提供する複製機能の話に移りましょう。ログインしてReplicationマップを作成してください。ただし、2人目のプレイヤーは接続しないでおいてください。

../../../_images/replicationmap1.png
  • 接続していてプレイヤーキャラクターがあり、走り回ることができます。キャラクターの色の強さが時間とともに変化していることに気付くでしょう。ゲームには、複製できて実際に複製したくなるさまざまな値があります。しかしこの例では、色の値に的を絞ることにします。それでは、2人目のプレイヤーでルームに接続してください。

../../../_images/roomownernotification.png ../../../_images/visualreplication.png
  • 接続の際に、現在のルームオーナーの名前を表示していることに注意してください。これで、両方のプレイヤーが複製されている様子が見られるはずです。各プレイヤーは自分のクライアントに存在するのみでなく、移動することもできて、色の強さも複製されています。ここでは、リモートプレイヤー(つまり、ルームにいる他のプレイヤー)は青、ローカルプレイヤー(つまり、あなた)を赤で描画しています。それでは、値とアクターの複製を行う方法について見ていきましょう。移動同期についてはこのサンプルの後半で説明します。ReplicationBP >BlueprintsフォルダーにあるThirdPersonCharacterのBlueprintを開きましょう。

  • このブループリントのさまざまな機能を説明する多数のコメントが表示されるはずです。ここで重要なのは、Strix ReplicatorMovement SynchronizerNotification Listenerの各コンポーネントです。Strix Replicatorは各クライアント間でアクターを複製するために使用します。Movement Synchronizerはアクターの移動を同期し、Notification Listenerはネットワークイベントを待ち受けます。

注釈

複製を行う際に注意するべき点に、複製されたアクターは元のアクターと同じロジックを実行しているということがあります。このため、複製している値を設定するときにはローカルアクターでのみ設定を行う必要があります。そうしないと、レプリカが変更を上書きしてしまいます。これを容易にするために、StrixにはGet Is Owner関数があり、アクターがローカルアクターである場合にtrueを返します。このサンプルのさまざまな場所でこのチェックを使用していることが分かるでしょう。

注釈

上記に加えて、複製するアクターの一般的なロジックを再確認するといいでしょう。なぜなら、既存のロジックには毎ティックやプレイ開始時に1回のみ実行されるべきアクション、例えばスポーン地点へのテレポートプレイヤーのコントローラー関連の関数のようなものが含まれている可能性があるからです。この種のアクションが複製されたアクターに残っていると2回呼び出されてしまい、望ましくない動作になったり、そうでなくとも非効率になったりする可能性があります。

  • キャラクターと値を複製するには、Replicatorコンポーネントをアタッチし、複製したい変数の[詳細] パネルの [レプリケーション] オプションを [Replicated] に設定するのみです。誰かがゲームに参加したことを表示したい場合は、Room Join Notification Eventからその情報を表示します。Replicatorコンポーネントは、Replicatedになっている変数を自動的に同期します。ただし、[Auto Register Properties] が無効になっている場合は、これは行われず、C++コード内でプロパティを手動で登録する必要があります。

../../../_images/updateroomownername.png
  • このレベルのGameModeを見ると、ルームオーナーの情報を表示するためのロジックが見つかります。Replicatorのコンポーネントには、On Sync BeginOn Ownership Receivedというそれ自身のイベントがあります。On Sync BeginはReplicatorがサーバーとの同期を開始したときに呼び出され、On Ownership Receivedはこのクライアントがルームオーナーになったときに呼び出されます。これら2つのイベントで、ルームオーナーの名前を表示しています。

../../../_images/replicatorsettings.png
  • Strix Replicatorにはいくつかの設定があり、複製のセクションで説明しています。ここで関係があるのは [Instantiable By] の設定です。これは、プレイヤーでは [Anyone] に、GameModeでは [Room Owner] に設定されていることに注意してください。Strixにはルームオーナーという概念があります。これは、ルームを作成した最初のクライアントです。ルームオーナーは、そのルーム内でのアクションに対する権限を提供します。複製を行う場合、[Anyone] に設定すると、各クライアントがアクターを作成し、それが複製されるようになります。[Room Owner] に設定すると、ルームオーナーのみがこのアクターを作成します。他の全てのクライアントは、アクターのレプリカ(リモート)を作成しますが、自分のアクター(ローカル)は作成しません。つまり、全てのクライアントで単一のGameModeインスタンスを使用できるため、変数の設定をルームオーナーのみに制限し、ロジックがクライアントごとに1回呼び出されるようにすることができます。また、GameModeでは、[Connection Closed Behaviour] が [Change Ownership] になっている点にも注意してください。これは、オーナーが切断された場合でも、このGameModeを存続させたいからです。

  • ルームオーナーはゲームプレイ中に変わることがあります。これは通常、ルームオーナーがいなくなったときに行われ、新しいクライアントが自動的に選ばれてそのルームに責任を持つようになります。ルームオーナーには、権限が必要なアクションの実行、情報の処理と全クライアントへの複製、移動プラットフォームやNPCなどのプレイヤーがコントロールしていないアクターの複製といったことを行わせることができます。

ここでの例は全て移動同期を使用しています。

  • アクターの位置を同期するには、Strix Movement Synchronizerを追加して、好みに合わせて設定を微調整します。ここでは、キャラクターの基本的な地上移動にMovement Synchronizerを使用しています。

  • ここからは、Flying Movementマップを作成してください。

../../../_images/flying.png
  • この飛行の例は、異なる値が必要になるようなStrix Movement Synchronizerコンポーネントの別の使用法を示しています。FlyingSyncBP/BlueprintsフォルダーにあるFlyingPawnのBlueprintを開いて、これらの値を確認し、プレイしてみることができます。