Iris では、既存の Unreal Engine (UE) の汎用的なレプリケーション システムとの後方互換性が可能な限り維持されています。ただし、2 つのシステムの主な違いに対応するために、ゲームプレイ コードに変更を加える必要がある場合があります。
Iris の主要な設計原則の 1 つは、レプリケーション システムとゲームプレイ コード間のやり取りの数を最小限に抑えることです。このため、Iris では仮想関数呼び出しの数を削減しています。汎用的なシステムからのこれらの仮想関数呼び出しは、Iris レプリケーション システムを介した API 関数への明示的な呼び出しに置き換えられます。
次の表はその一覧です。
- 現在のレプリケーション システムの機能。
- Iris での変更の有無。
- システムが変更された場合に、対応する Iris の機能。
- 詳細に関するドキュメント ページへのリンク。
既存のレプリケーション機能 | Iris での変更 | Iris のレプリケーション機能 |
---|---|---|
休止 | ||
優先順位 | ✓ | Iris の優先順位付け |
プロパティのレプリケーション | ||
関連性 | ✓ | Iris フィルタリング |
リモート プロシージャ コール (RPC) | ||
サブオブジェクトのレプリケーション | ✓ | Iris のサブオブジェクトのレプリケーション |
上の表のうち、Iris での変更にチェックが付いていないものは、汎用的なレプリケーション システムと同じように動作します。
プッシュ モデル
Iris は、完全なプッシュベースを目指しています。プッシュ モデル レプリケーションなしで Iris を使用することもできます。特定のオブジェクトでプッシュ モデル レプリケーションが有効になっていない場合、Iris は NetUpdateFrequency
に基づいたオブジェクトのポーリングで自動的に、フォールバックします。デフォルトでは、Iris は標準的なプッシュ モデルの設定を尊重します。
レプリケートされたプロパティ
レプリケートされたプロパティは、汎用的なレプリケーション システムと同様に動作します。レプリケートされたプロパティの UE での動作の詳細については、「アクタのプロパティをレプリケートする」ドキュメントを参照してください。
リモート プロシージャ コール
Iris におけるリモート プロシージャ コール (RPC) の宣言と実行は、汎用的なレプリケーション システムおよびレプリケーション グラフと同様に機能します。RPC とレプリケートされたプロパティの更新が受信側マシンで実行される方法の詳細については、「レプリケーション実行順序」ドキュメントを参照してください。
サブオブジェクトのレプリケーション
Iris では「登録済みサブオブジェクト リスト」を有効にする必要があります。アクタ クラスで登録済みサブオブジェクト リストを使用するには、レプリケートされたアクタのコンストラクタに以下を追加します。
bReplicateUsingRegisteredSubObjectList = true;
Iris を使用している場合、AActor
または UActorComponent
から派生していないレプリケートされたサブオブジェクトも、仮想関数 RegisterReplicationFragments
を実装して、レプリケートされたプロパティと関数を登録する必要があります。UObject
派生クラス UMyDerivedObject
で RegisterReplicationFragments
を実装するには、以下のコードをそれぞれ MyDerivedObject.h
ファイルおよび MyDerivedObject.cpp
ファイルに追加します。
MyDerivedObject.h
#if UE_WITH_IRIS
// レプリケーション フラグメントを登録する
virtual void RegisterReplicationFragments(UE::Net::FFragmentRegistrationContext& Context, UE::Net::EFragmentRegistrationFlags RegistrationFlags) override;
#endif // UE_WITH_IRIS
MyDerivedObject.cpp
#if UE_WITH_IRIS
#include "Iris/ReplicationSystem/ReplicationFragmentUtil.h"
#endif // UE_WITH_IRIS
#if UE_WITH_IRIS
void UMyDerivedObject::RegisterReplicationFragments(UE::Net::FFragmentRegistrationContext& Context, UE::Net::EFragmentRegistrationFlags RegistrationFlags)
{
// 記述子を作成し、このオブジェクトの PropertyReplicaitonFragments を割り当てる
UE::Net::FReplicationFragmentUtil::CreateAndRegisterFragmentsForObject(this, Context, RegistrationFlags);
}
#endif // UE_WITH_IRIS
レプリケートされたサブオブジェクトの詳細については、「レプリケートされたサブオブジェクト」のドキュメントを参照してください。
カスタムのネットワーク シリアライザ
Iris では、ネットワークのシリアル化のためにレプリケートされたプロパティとして使用できるすべての Unreal Engine のプリミティブ型をサポートしています。構造体がカスタムの NetSerialize
メソッドを使用していて、Iris 固有の実装がない場合は、以下の警告がログに記録されます。
Warning: Generating descriptor for struct STRUCT_NAME that has custom serialization.
NetSerialize
メソッド内のデータが、プロパティ ネットワークのシリアル化メソッドのみを使用してレプリケートできる場合は、プロジェクトの「DefaultEngine.ini
」ファイルにエントリを追加することで、警告を消去することができます。
DefaultEngine.ini
[/Script/IrisCore.ReplicationStateDescriptorConfig]
; Declarate structs that are vetted to work using reflection based struct serialization even though there exists a custom NetSerialize function for the struct
+SupportsStructNetSerializerList=(StructName=STRUCT_NAME)
高速配列レプリケーション
Iris は既存の高速配列定義をサポートしています。Iris は、IrisFastArraySerializer.h
にある専用の高速配列シリアライザ FIrisFastArraySerializer
も提供しています。
ピアツーピア
Iris は、Unreal Engine のリッスン サーバーをサポートしています。リッスン サーバーを使用すると、ゲーム インスタンスはマルチプレイヤー ゲーム セッションのホストとして動作しながら、独自のローカル プレイヤーもサポートできます。
レプリケーション グラフ固有の違い
Replication Graph プラグインは、レプリケートする永続オブジェクトのリストを含むノード上に構築されたネットワーク レプリケーション システムです。Iris はレプリケーション グラフをサポートしていません。Iris とレプリケーション グラフは別個のシステムであり、ネットワーク ドライバーはどちらか一方しか使用できません。Iris には、アクタがいつ、どこにレプリケートされるかを制御するためのレプリケーション グラフと同じ意味でのノードの概念がありません。代わりに、新しいネットワーク オブジェクト フィルタとプライオリタイザが、レプリケーション グラフに代わる機能となっています。詳細については、「フィルタリングおよび優先順位付け」のドキュメントを参照してください。