アクタには、レプリケーションに重要な 2 つのプロパティ、Role と RemoteRole があります。
プロパティは次の情報を伝えてくれます。
アクタの権限を有する人
アクタのレプリケート有無
レプリケーションのモード
まず判断のために重要なのが、特定アクタの権限者です。現在エンジンで実行中のインスタンスに権限があるかどうかを判断するには、 Role プロパティが ROLE_Authority
かどうかをチェックします。このプロパティである場合は、Unreal Engine (UE) で実行中のこのインスタンスがアクタの権限を持ちます (レプリケートされたかどうかに関係なく)。
Role が ROLE_Authority
、 RemoteRole が ROLE_SimulatedProxy
か ROLE_AutonomousProxy
のどちらかの場合は、エンジンのこのインスタンスはリモート接続先へこのアクタのレプリケートを担当します。
現在はサーバーのみがアクタを接続先クライアントへレプリケートします (クライアントがアクタをサーバーへレプリケートすることはありません)。この状況を踏まえて、サーバー だけ に Role == ROLE_Authority
と RemoteRole == ROLE_SimulatedProxy
または ROLE_AutonomousProxy
が見えなくてはいけません。
Role/RemoteRole の反転
Role と RemoteRole は値を調査する人次第で反転させることができます。例えばサーバーが以下の設定の場合:
Role == ROLE_Authority
RemoteRole == ROLE_SimulatedProxy
クライアントは以下のように理解します:
Role == ROLE_SimulatedProxy
RemoteRole == ROLE_Authority
サーバーはアクタを管理して、このアクタをクライアントへレプリケートするため、これは理にかなっています。クライアントは更新を受け取るのみで、更新間隔のアクタをシミュレートします。
レプリケーションのモード
サーバーは更新ごとにアクタをレプリケートしません。更新ごとにレプリケートすると、帯域幅と CPU リソースを消費しすぎてしまいます。代わりに、サーバーは AActor::NetUpdateFrequency
プロパティに指定された頻度でアクタをレプリケートします。
つまり、アクタを更新する間にクライアントへある程度の時間がパスされます。これはアクタが散発的で不安定な状態に見える要因となります。この問題を補正するために、クライアントは更新と更新の間にアクタをシミュレートします。
現時点では 2 つのタイプのシミュレーションが発生します。
`ROLE_SimulatedProxy`
これは標準的なシミュレーションパスで、通常は最後の既知のベロシティに基づく推定動作に基づいています。特定のアクタに対しサーバーがアップデートを送信すると、クライアントは新しい位置の方向へ自身の位置を調整して、アップデートの間にサーバーから送信された直近のベロシティに基づいてアクタを動かし続けます。
最後の既知のベロシティを利用したシミュレーションは、通常のシミュレーション方法の一例です。その他の情報を使用できるようにカスタムコードを記述して、サーバー更新間に推定するも構いません。
`ROLE_AutonomousProxy`
通常は PlayerControllers に所有されるアクタ上のみで使用します。つまり、このアクタはヒューマン コントローラーから入力を受け取っています。よって、推定時により多くの情報が与えられて、足りない情報の埋め合わせに実際のヒューマン入力を利用することができます (最後の既知のベロシティに基づく代わりに)。