Open8

UE4_マルチプレイ

Rotationの値がサーバー、クライアントで異なる

あるActorのRotationをGetWorldTransform>BreakTransformで取得
RotationのY(Pitch)値を0~360の間に設定したけど、BP内でマイナス値になっている。
サーバー側はマイナス値を反映した影響で挙動がおかしい。
Rotationをクライアント側に送信
マイナス値ではなく0~360の値に収まっている。

ビューポートで回転を行う際にはクォータニオンで計算しており、表示上はオイラーに変換して表現しています。
https://historia.co.jp/archives/18699/

https://answers.unrealengine.com/questions/879382/rotate-a-mesh-around-its-center-using-quaternion.html

サーバーだけマイナス値になる原因は不明

アクターに対するマルチキャスト

Character側でマルチキャストイベントを呼び、そのイベント内からアクターBPの関数を呼び、アクターBP内の値を変えたら全クライアントにも反映されるものだと勘違いしていた。
おそらく権限の問題。アクターはサーバーで生まれるので、サーバーじゃないと変更できない。
アクターの値を変更し、その結果を複製したい場合は、マルチキャストはアクターBP内で呼ぶ。

Get Controlled Pawn でキャラが取得できない場合(サーバー上)

原因

Begin Play で呼んでいたため、キャラクターがコントローラーに紐づくまでラグがあったと推測。
Delayを挟んだらサーバー上でも取得できた。

すべてのプレイヤーの情報を取得したい場合

GameStateではPlayerArrayを使ってプレイヤー情報を取得できる。

PlayerControllerを取得する例

オンラインマルチプレイ用オススメプラグイン

Lobbyist

https://www.unrealengine.com/marketplace/ja/product/lobbyist
ロビー作成のためのプラグイン。他にもロビー作成用のアセットをいくつか漁ってみたが、これが一番すぐれている印象。オンライン初心者で苦戦していたが、Lobbyistのドキュメントが優秀なため、読んでいくうちにオンラインに対する理解も深めることができた。開発者のサポートも手厚い。

インタラクトの実装例(アイテム取得やスイッチを押す等)

  1. クライアント上(ローカル)でLineTraceを飛ばし、ヒットしたインタラクト対象を変数Aに保存。
  2. 特定のキーを押したら、サーバー実行で変数A(インタラクト対象)に実装されたインターフェースを実行する。
    サーバー実行する理由はラグ発生対策。ホスト側とクライアント側がアイテムを同時に拾おうとした時など問題が発生する可能性があるため。
  3. インタラクト対象のBPでインタラクトしてきたプレイヤーを変数に保存する。こうすることで他のプレイヤーがインタラクトできないようにすることもできる。

ラグを意図的に引き起こす

DefaultEngine.iniに以下の設定を追加
[PacketSimulationSettings]
PktLag=200

ログインするとコメントできます