アクタの Role と RemoteRole プロパティ

アクタ オブジェクト レプリケーションの多様な側面

Choose your operating system:

Windows

macOS

Linux

アクタには、レプリケーションに重要な 2 つのプロパティ、 Role RemoteRole があります。

プロパティは次の情報を伝えてくれます。

  • アクタの権限を有する人

  • アクタのレプリケート有無

  • レプリケーションのモード

まず判断のために重要なのが、特定アクタの権限者です。現在エンジンで実行中のインスタンスに権限があるかどうかを判断するには、 Role プロパティが ROLE_Authority かどうかをチェックします。このプロパティである場合は、エンジンで実行中のこのインスタンスがアクタの権限を持ちます (レプリケートされたかどうかに関係なく)。

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 に所有されるアクタ上のみで使用します。つまり、このアクタはヒューマン コントローラーから入力を受け取っています。よって、推定時により多くの情報が与えられて、足りない情報の埋め合わせに実際のヒューマン入力を利用することができます (最後の既知のベロシティに基づく代わりに)。

Unreal Engine のドキュメントを改善するために協力をお願いします!どのような改善を望んでいるかご意見をお聞かせください。
調査に参加する
キャンセル