BLOGブログ

2019.08.14UE4/Network

[UE4] マルチプレイでの所有権とRPC

執筆バージョン: Unreal Engine 4.22

やあ、こんにちは!

今日はUE4でマルチプレイの勉強を始めると最初にぶち当たると思う所有権とRPCについてお話していくよ。

僕もマルチプレイ機能を一通り勉強した後、初めてマルチプレイゲーム開発を行っていたんだ。所有権とか結構色々な資料で注意されていたけど、余裕ぶっこいてたら後半でバグ生み出してたよ。怖いね。

なので僕のおさらいも含めて所有権とRPCについてまとめるよ。

 

所有権

マルチプレイを勉強する中で一番ハマりやすいポイントなのが所有権についてなんだ。僕も実際にわからなかったし、苦い思いもさせられた。

シングルプレイだと全く意識しなくていい事なんだけど、マルチプレイではその所有権が重要になってくる。

UE4は基本的にActorを使用して開発を進めていくよね。GameModeやPlayerController、Pawn、CharacterもActorだし、自分で作成したBlueprintも大体Actorを選択して作ってると思う。

そしてActor達がWorldに生成されて動き出すわけだけど、そのActor達は生成したサーバー or クライアントが所有しているんだ。

マルチプレイになるとReplicateの関係で基本サーバーでActorの生成を行うから、基本サーバーが所有権を持っている。もちろん、クライアントで生成すれば所有権はクライアントになるけれどReplicateされないから関係ないよね。

例外としてPlayerControllerとPlayerState、PlayerPawnなどプレイヤーに関係のあるものの所有権は各サーバー/クライアントになるけどね。

で重要とか口うるさく言われてるけど、何が重要なのかというと所有権の有無でRPCの機能に制限がかかってしまう。ここが一番のポイント。

ここを理解した上で次のRPCに進んでほしい。

 

RPC (Remote Procedure Call)

サーバー/クライアント間でイベント関数の実行をすることができるスーパー便利な機能!

なのはすごくいいんだけど、サーバーやクライアントで変わってくるし、前に説明したけど所有権がどうこうとかで制限が出てしまう。僕が初めて勉強した時は頭に?を浮かべたものさ。

種類は3種類あるんだけど、1つずつサーバーでの挙動、クライアントでの挙動、所有権の有無での制限を説明していくよ。

そして当たり前だけど大事なことで、ActorがReplicateされていてサーバー/クライアントに存在してる必要があるから気を付けてね。

ちなみにRPCの設定方法は、カスタムイベントを選択して右の詳細から選択できるよ。

 

Run On Server (サーバーで実行)

クライアントからサーバーへイベント実行させる。サーバーが呼び出すとそのままサーバーが実行する。

こんな感じ。

Replicateはされているんだけど、サーバーが所有権を有している場合は使用できない。

こんな感じ。

PlayerPawnではできるのでそれ以外のActorで起こりがちだから注意が必要。基本クライアントのActorは所有権を持っていないから、PlayerControllerなどに代わりにやってもらったりする。

失敗例:クライアントでドアを開いた→よし!サーバーにドアのActorからRun On Serverで開いた通知しよう→サーバーのドア「君が言ってこないで。」→クライアントのドア「えっ!?」

 

Run On Client (所有しているクライアントで実行)

サーバーから所有権を持っているクライアントへイベントを実行させる。サーバーが所有権を持っている場合、サーバーが実行する。

こんな感じ。

 

Multicast (マルチキャスト)

サーバーから所有権関係なしにサーバーと全クライアントへイベントを実行させる。

こんな感じ。

所有権を持っていてもクライアントからは実行されない。

こんな感じ。

おしまい!これからマルチプレイを始める君への手助けになれたらうれしい!

最後に一言。サーバーは最強。

色々書いたけど、手を動かして覚えようね!