Unreal Engine のレベルは非常に大きくすることができます。プレイヤーはそのレベルの中の合計アクタ数のほんの一部しか見ることができません。ほとんどのアクタは非表示で、聞き取ることもできず、現在のプレイヤーに対する重要なエフェクトがありません。サーバーがクライアントに影響を及ぼすと判断するアクタ群は、そのクライアントに 関連する アクタ群と判断されます。関連するアクタ群は、クライアントごとに、またはネットワーキングの観点から見て接続ベースで判断されます。Unreal Engine では、クライアントに関連する場合のみ、アクタをクライアントにレプリケートします。
次の画像の比較は、距離ベース の関連性を使用する例を示しています。プライマリ アクタ (フレームの中央) は、300 センチメートル (3 メートル) 以内であれば、レプリケートしたアクタが関連性を保つように設定されています。前の画像では、セカンダリ アクタが 300 センチメートル以内にあり、関連性があります。つまり、セカンダリ アクタはプライマリ アクタの接続に対してレプリケートされ、表示できます。後の画像では、セカンダリ アクタはプライマリ アクタから 300 センチメートルを超えて移動しているため、アクタはプライマリ アクタに関連性がなくなり、プライマリ アクタの接続にレプリケートされず、表示できません。


動的にスポーンされてレプリケートされているアクタは、関連性がなくなるとクライアントで破棄されます。そのため、この場合、セカンダリ アクタはプライマリ アクタに対して表示できなくなります。
アクタの関連性を取得する
ネットワーク ドライバでは、AActor::IsNetRelevantFor
を呼び出して、特定の接続に対してアクタが関連性があるかどうかを決定します。これは、ネットワーク ドライバによって自動的に処理されます。
関連性のあるアクタを作成する
AActor
派生のクラスで AActor::ForceNetRelevant
を呼び出して、任意のアクタを関連性があるように強制できます。
アクタの関連性をオーバーライドする
アクタの関連性をカスタマイズするには、仮想関数 AActor::IsNetRelevantFor
を AActor
派生クラスでオーバーライドします。
AActor::IsNetRelevantFor
をオーバーライドするときは注意が必要です。Unreal Engine のレプリケーション システムに慣れていないと、意図しない結果に至る場合があります。
関連性の決定方法
仮想関数 AActor::IsNetRelevantFor
は、接続に関連性のあるアクタ群を決定するために複数のテストを実装しています。
パラメータ
AActor::IsNetRelevantFor
では、3 つのパラメータを使用して、呼び出すアクタ オブジェクトが関連しているかどうかを決定します。
パラメータ | 説明 |
---|---|
RealViewer |
関連性が確認されている現在のアクタを制御するクライアント ネットワーク オブジェクト。通常、これはプレイヤー コントローラーです。 |
ViewTarget |
RealViewer によって、現在表示または制御されているアクタ。通常、これはポーンです。 |
SrcLocation |
ネットワーク オブジェクトを制御するソースの位置。これは、距離ベースの関連性が有効な場合に使用されます。 |
関連性ロジック
特定のアクタおよび接続に対して、以下のテストが実行されます。
- 次の条件の少なくとも 1 つが有効な場合、現在のアクタはその接続に対して関連性があります。
- 現在のアクタが常時関連している。
- 現在のアクタが現在の接続のポーンによって所有されている。
- 現在のアクタが現在の接続のプレイヤー コントローラーによって所有されている。
- 現在のアクタが現在の接続のポーンである。
- 現在の接続のポーンが、騒音やダメージなどの一部のアクションのインスティゲーターである。
- 次の条件が有効な場合、レプリケーション システムでは、現在のアクタの所有者の関連性を使用して、この接続に対して関連性があるかどうかを決定します。
- 現在のアクタに所有者がある。
- 現在のアクタがその所有者のネット関連性を使用するように設定されている。
- 次の条件が有効な場合、現在のアクタはその接続に対して関連性がありません。
- 現在のアクタはその所有者にのみ関連性がある。
- 現在のアクタに所有者がない。
- 現在のアクタの所有者は関連性がない。
- 次の条件が有効な場合、システムでは現在のアクタのベースとなる関連性を使用して、この接続に対して関連性があるかどうかを決定します。
- 現在のアクタが別のアクタのスケルトンにアタッチされている。
- 次の条件が有効な場合、現在のアクタはその接続に対して関連性がありません。
- 現在のアクタが非表示である。
- 現在のアクタにルート コンポーネントがないか、ルート コンポーネントのコリジョンが有効になっていない。
現在のアクタにルート コンポーネントがない場合、
AActor::IsNetRelevantFor
は警告をログに記録し、アクタが常に関連しているかどうかを尋ねます。 - 次の条件が有効な場合、現在のアクタはその接続に対して関連性があります。
- ゲーム ネットワーク マネージャー (
AGameNetworkManager
) が距離ベースの関連性を使用するように設定されている。 - 現在のアクタが関連性距離内にある。
- ゲーム ネットワーク マネージャー (
この関連性ロジックは、ベース AActor
クラス用です。他の AActor
派生クラスにさまざまなネットワーク関連性ロジックが含まれている場合があります。たとえば、APawn
クラスと APlayerController
クラスは、AActor::IsNetRelevantFor
をオーバーライドします。したがって、関連性にさまざまな条件があります。詳細については、 Pawn.cpp
と PlayerController.cpp
を参照してください。
関連性設定をカスタマイズする
Unreal Editor の [Details (詳細)] パネルの [Replication (レプリケーション)] セクションまたは C++ で、AActor
派生クラスのネットワーク関連性設定をカスタマイズできます。
関連性のリファレンス
以下の表に、AActor
クラスにあるアクタの関連性に関する関数とプロパティを示します。
関数
名前 | 説明 |
---|---|
ForceNetRelevant |
デフォルトでこのアクタが関連していない場合、アクタがネットワークに関連するように強制できます。 |
IsNetRelevantFor |
このアクタが特定のネットワーク接続に関連しているかどうかを確認します。 |
IsRelevancyOwnerFor |
bOnlyRelevantToOwner とマークされたアクタに対するネットワーク関連性チェックの実行時に、このアクタが所有者であるかどうかを確認します。 |
IsReplayRelevantFor |
このアクタが記録されたリプレイに関連しているかどうかを確認します。 |
IsWithinNetRelevancyDistance |
特定のソースの位置とこのアクタの位置の間の距離の 2 乗が NetCullDistanceSquared 内にあるかどうかを確認します。 |
プロパティ
名前 | 説明 |
---|---|
bAlwaysRelevant |
ネットワークのレプリケーションに常に関連しています。bOnlyRelevantToOwner をオーバーライドします。 |
bNetUseOwnerRelevancy |
このアクタに有効な所有者があると、所有者の IsNetRelevantFor と GetNetPriority が呼び出されます。 |
bOnlyRelevantToOwner |
true の場合、このアクタはその所有者のみに関連性があります。 |
bRelevantForNetworkReplays |
true の場合、このアクタはネットワーク リプレイにレプリケートされます。デフォルトでは true です |
NetCullDistanceSquared |
このアクターが関連し、レプリケートされるクライアントのビューポートからの最大距離の 2 乗です。 |
Owner |
このアクタの所有者。bNetUseOwnerRelevancy と bOnlyRelevantToOwner とともにレプリケーションに使用されます。 |