プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【UE5】Play As Clientについて学習

※誤っている可能性が非常に高いです。自分の考えをまとめることを目的としているため、それなりに順序不同・支離滅裂です。

 

 

Unreal Engineのサーバーについて

Net Modeでサーバーモードを選択できます。

「Play Standalone」はサーバーを用いないものと思ってください。

 

クライアントのいずれかをゲームサーバーのホストとするような考えが「Play As Listen Server」です。

クライアントとは別にサーバーがある状態を「Play As Client」となります。

 

「Play As Listen Server」では、ホストが終了されると全クライアントも終了されます。

ですが、「Play As Client」では、ホストが存在しないのでどのクライアントが終了されてもゲームは終了されません。

 

 

オブジェクト

オブジェクトを各クライアントで認識するためには、基本的にオブジェクトはサーバーで生成するようにする必要があります。

クライアントで生成したとしても、そのクライアントのみで描画され、ほかのクライアントでは描画されません。

仕組みとしては、サーバーで生成し、各クライアントにコピーされるという考えです。

 

レベル上に配置。サーバーで生成し、各クライアントと同期

オブジェクトを同期するため、アクターの詳細から「Replicates」を有効にします。

これにより、アクターの生成はサーバーと各クライアントで同期されます。

 

 

Actor Spawnでゲームに生成。サーバーで生成し、各クライアントと同期

アクターをスポーンする場合、スポーンはサーバーのみで行わせます。

そのため、UEC++の場合「UKismetSystemLibrary::IsDedicatedServer(this);」という関数を用い、これがtrueの時のみ生成をさせます。

BPの場合は以下のノードがtrueの時のみ生成処理を呼びます。

そうしなければ、サーバー+各クライアント数のアクターが生成され、判定が不正確になってしまいます。

 

 

オブジェクトの同期

ゲーム中、アクターに変化を与え、全クライアントに同期させたくなります。

 

オブジェクトは基本的にサーバーで生成します。そのため、そのオブジェクト内で処理を行うと、サーバーには影響しますが各クライアント上では見た目的な変化は起きません。

 

サーバーのみの実行ではなく、各クライアントでも処理をさせるように対応させます。

UEC++では、処理をさせたい関数は以下のように宣言させます。

UFUNCTION(NetMulticast, Reliable)
void DoFunction();
void DoFunction_Implementation();

void AAA::DoFunction_Implementation()
{
    // サーバーと各クライアントで実行する処理
}

DuFunctionは定義する必要ありません。緑波線はほっときましょう。

 

 

サーバーかクライアントか確認

オブジェクトのTickなどで適当に「PrintString」を接続させます。

そうすると出力表示に「Server: 」や「Client1: 」などと表示されます。これによりどこで生成され、どこで呼ばれているのか確認ができます。

 

 

生成した対象内のみで処理を実行

UEC++の場合は「HasAuthority()」という関数で判断できます。

BPの方でも「Has Auhority」というノードがあります。