[UEC++ 学習] UE ネットワーク - レプリケーション、RPC

1. UEのネットワークアーキテクチャ

(1) UE のネットワーク アーキテクチャは SC (サーバー クライアント) モードであり、このモードの利点: このモードでは、すべてのクライアントがサーバー側でセキュリティ検証を実行できるため、クライアント側での不正行為の問題を効果的に防ぐことができます。
(2) リッスンサーバー(参加待ちサーバー):LAN 上に構築されたサーバーは、他の人の参加を待っています。つまり、1 人がサーバーとなり、もう 1 人がクライアントになります。専用サーバー。
(3) クライアント上で操作するロールをローカルロールと呼びますが、リモートロールと呼ばれるサーバー上のロールもあります。

GamePlay フレームワークは SC アーキテクチャに基づいています。GameMode
はサーバー側にのみ存在し、PlayerController_Server はサーバー側に存在します。
ゲーム インスタンスが開始されるたびに、対応する UI と GameInstance が生成されるため、各クライアントとサーバーは独自の一意の GameInstance と UI を持ちます。

ネットワーク情報の送信方法
(1) Replication(网络复制): 一方向のみ可能、サーバーからクライアントへコピー
(2) RepNotify: プロパティ変更時にネットワーク通知機能を実行
(3) RPC: 方向は任意

2. レプリケーション

公式ドキュメント:マルチプレイヤー ゲーム プログラミング クイック スタート ガイド

2.1 アクターのレプリケーション

ネットワーク情報はサーバーからクライアントにのみ渡すことができ、クライアントはサーバーに情報を送信するために RPC を必要とします。すべてのアクターはネットワーク レプリケーションが可能です。

タイプ:
(1) Actor Replication- アクター ネットワーク レプリケーション
(2) Property Replication- プロパティ ネットワーク レプリケーション
(3) Component Replication- コンポーネント ネットワーク レプリケーション

C++ でのオープン レプリケーション

/** 在Actor类中直接设置为true */
// 开启网络复制
bReplicates = true;

ブループリントでレプリケーションを有効にする

ここに画像の説明を挿入

C++ でのオープン レプリケーション

/** 在Actor类中直接设置为true */
// 开启网络复制
bReplicates = true;

テスト: レプリケーションが有効になっていない場合、レプリケーションはサーバー側でのみ生成され、クライアント側では生成されません。

プレーヤーの数を 2 に調整し、ネット モードをリッスン サーバーとして再生するように変更します。

ここに画像の説明を挿入

そして、アクターがサーバー内でのみ生成されるように、レベル ブループリントでアクターを生成します。

ここに画像の説明を挿入

サーバー上に存在するオブジェクトがクライアント上に存在しないことがわかりますが、オブジェクトはクライアント上で物理的な衝突検出を持っています。これは、キャラクターの移動コンポーネントがレプリケーションであるため、クライアントが空中でブロックされるためです。壁。

ここに画像の説明を挿入

ここに画像の説明を挿入

2.2 プロパティのレプリケーション

ブループリントでプロパティ レプリケーションを有効にする

ここに画像の説明を挿入

C++ でのオープン プロパティ レプリケーション

/** 1. 在属性中定义Replicated */
UPROPERTY(Replicated)
float Time = 100.f;

/** 2. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */
void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    
    
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	DOREPLIFETIME(ARPGTestCharacter, Time);
}

これはサーバー上でのみ設定され、クライアント上の属性はレプリケーションを通じて複製および同期されます。

if(HasAuthority())
{
    
    
	// 对需要Replication的属性进行设置
	Time = 200;
}

2.3 RepNotify

ブループリントで RepNotify をオンにする

ここに画像の説明を挿入

RepNotify は関数を自動的に生成します。プロパティが変更されると (つまり、レプリケーションが発生すると)、クライアントとサーバーの両方がブループリントに対してこの関数を 1 回実行します。

C++ で RepNotify を開く

/** 1. 定义为ReplicatedUsing,并添加通知的函数名 */
UPROPERTY(ReplicatedUsing = OnRep_Time)
float Time = 100.f;

/** 2. 定义通知发生时的函数 */
// Rep_Notify的回调函数必须加上UFUNCTION()
UFUNCTION()
void OnRep_Time();

/** 3. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */
void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    
    
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);
	DOREPLIFETIME(ARPGTestCharacter, Time);
}

注: C++ の RepNotify の場合、この関数はクライアント側でのみ実行されます。

3. オーナー

所有者はチェーンであり、最終的には PlayerController まで遡り、Connect を通じてサーバーに接続されます。

ブループリントで所有者を指定する

ここに画像の説明を挿入

C++ での所有者の指定

/** 通过SpawnActor指定Owner */
AActor* SpawnActor( UClass* Class, 
					FTransform const* Transform, 
					const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters());
// 在FActorSpawnParameters中指定Owner
struct ENGINE_API FActorSpawnParameters
{
    
    
	FActorSpawnParameters();
	FName Name;
	AActor* Template;
	
	/** 指定Owner */
	AActor* Owner;
	
	APawn*	Instigator;
	class	ULevel* OverrideLevel;
}
/** AActor中的SetOwner函数 */
virtual void SetOwner( AActor* NewOwner );
/** AActor中的GetOwner函数 */
AActor* GetOwner() const;
/** 在Controller中调用Possess和UnPossess函数,在内部调用PossessedBy,最终调用SetOwner */
void APawn::PossessedBy(AController* NewController)
{
    
    
	/** 在PossessedBy中调用SetOwner */
	SetOwner(NewController);
	// ......
}

4. 俳優の役割

公式ドキュメント:アクターのロールと RemoteRole プロパティ

Authority: サーバー側にのみ存在し、すべてのインスタンスがサーバー側に権限を持ちます。
Autonomous Proxy: クライアント側のプレーヤーと同等であり、自律性がありますが、それでもサーバーの権限検証に合格する必要があります。
Simulated Proxy: 各クライアントには、他のクライアントとサーバーのインスタンスがあります。このインスタンスは Simulated です。すべてのフレームを同期することは不可能であるため、同期には間隔があり、Simulated はこの補間をシミュレートします。

5.RPC

公式ドキュメント: RPC

RPC は信頼性が低いため、値を返す必要はなく、ブループリントで RPC を設定できるのはイベントのみです。

ブループリントで RPC を開く

ここに画像の説明を挿入

C++ で RPC を開く

/**
* 声明RPC模式会定义XXX_Implementation()函数
* 声明WithValidation会定义XXX_Validate()函数,用于数据判断,若为false则直接断开RPC
*/

// 多播执行
UFUNCTION(NetMulticast, Reliable)
void MulticastExe();

// Server执行,WithValidation 
UFUNCTION(Server, Reliable, WithValidation)
void ServerExe();

// Server执行 
UFUNCTION(Client, Unreliable)
void ClientExe();

公式 Web サイトの表では、アクターの所有権と、対応するイベント設定モードが対応する効果を生成することが確認できますが、実際には設定を通じて呼び出すことができます。

ここに画像の説明を挿入

6. 理論の応用

6.1 アクターの役割の見分け方

主にスルーしてIs Locally Controlled()判断Get Local Role()する。

ここに画像の説明を挿入

6.2 サーバー側でクライアントの権限を取得する

GameModeはサーバー側にのみ存在するため、GameModeを通じて保存されます

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45617648/article/details/132044431