関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2019.08.14UE4UE/ Network
執筆バージョン: 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に進んでほしい。
サーバー/クライアント間でイベント関数の実行をすることができるスーパー便利な機能!
なのはすごくいいんだけど、サーバーやクライアントで変わってくるし、前に説明したけど所有権がどうこうとかで制限が出てしまう。僕が初めて勉強した時は頭に?を浮かべたものさ。
種類は3種類あるんだけど、1つずつサーバーでの挙動、クライアントでの挙動、所有権の有無での制限を説明していくよ。
そして当たり前だけど大事なことで、ActorがReplicateされていてサーバー/クライアントに存在してる必要があるから気を付けてね。
ちなみにRPCの設定方法は、カスタムイベントを選択して右の詳細から選択できるよ。
クライアントからサーバーへイベント実行させる。サーバーが呼び出すとそのままサーバーが実行する。
こんな感じ。
Replicateはされているんだけど、サーバーが所有権を有している場合は使用できない。
こんな感じ。
PlayerPawnではできるのでそれ以外のActorで起こりがちだから注意が必要。基本クライアントのActorは所有権を持っていないから、PlayerControllerなどに代わりにやってもらったりする。
失敗例:クライアントでドアを開いた→よし!サーバーにドアのActorからRun On Serverで開いた通知しよう→サーバーのドア「君が言ってこないで。」→クライアントのドア「えっ!?」
サーバーから所有権を持っているクライアントへイベントを実行させる。サーバーが所有権を持っている場合、サーバーが実行する。
こんな感じ。
サーバーから所有権関係なしにサーバーと全クライアントへイベントを実行させる。
こんな感じ。
所有権を持っていてもクライアントからは実行されない。
こんな感じ。
おしまい!これからマルチプレイを始める君への手助けになれたらうれしい!