PhotonCloudPUN2でカクつかないブレないエラーが出ない同期のコツ
こんにちは!ジェイです。毎日オンラインゲーム制作頑張ってます!特に最近は車の同期をするのに、必死にプログラミングをしていて、気づいた同期について説明します。
この記事を見るとオンラインゲーム制作で、PhotonCloudPUN2を使った時に、キャラクターや車をヌルヌル動かす方法がわかります。
同期する手段の種類
PhotonCloudPUN2の同期のする手段は大きく分けて以下の物があります。
- ルームプロパティ
- プレイヤープロパティ
- リモートプロシージャーコール(RPC)
- PhotonTransformView
- PhotonTransformViewClassic
- PhotonSerializeView
- PhotonAnimtorView
ルームプロパティ
ルーム1つに対しての同期の設定で、部屋の最高人数を設定したり、その部屋内で共有するデータをHashtableを使うことで同期することができます。
プレイヤープロパティ
プレイヤー1人ずつに対して設定する変数を同期する事ができます。こちらもHashtableを使います。
リモートプロシージャーコール(RPC)
自分が実行した関数を他のプレイヤーにも同じ関数を実行させられます。使う時には必ずPhotonViewコンポーネントが必要です。
PhotonTransformView
位置と回転とScaleの同期を毎ループ行ってくれます。それぞれチェックを入れた項目のみ同期されます。
PhotonAnimtorView
その名の通りアニメーションの同期をしてくれます。
適切な同期の選び方
まずUnityで物を動かそうとした時にとれる手段は以下の通りです。
- Transform.positionやrotationを直接いじる
- Transform.Translateメソッドで移動させる
- CharactorController.Moveで移動させる
- RigidbodyのAddForceを使う
CharactorControllerを使うにはCharactorControllerコンポーネントが必要で、Rigidbodyを使う時はRigidbodyコンポーネントが必要です。
CharactorControllerを使う場に1番良い方法
結論からいうと、PhotonViewClassicをSynchronize Valuesを使う事によって、リアルタイム制の高いアクションゲームでもヌルヌル同期できます。
CharactorControllerは自キャラを動かす時に使います。Rigidbodyと併用もできますが、ここではしない事を前提で話を進めます。PhotonViewClassicは以前のバージョンのPUNの時のPhotonViewとほとんど同じ仕様です。
- CharactorControllerとPhotonViewとPhotonViewClassicをアタッチする
- PhotonViewのInterpolateとExtrapolateをSynchronize Valuesを設定
- スクリプト内でCharactorController.Moveに計算した移動量を渡す
詳しくは以下を参照
Transform.PositionやRotationを直接いじる場合やTransform.Translateメソッド使う場合も、リアルタイム性の高いアクションゲームなどはこの設定が同期の精度が1番高いです。
Rigidbodyを使う時に1番良い方法
これも結論からいうと、RigidbodyにInterpolateをInterpolateにして、PhotonRigidBodyViewのSynchronize VelocityとSynchronize Angular Velocityにチェックを入れる方法です。


それとRigidbodyを使う時には、オンライン上の同期だけでなく、オフラインの時でもカメラの処理をLateUpdateに書くのとInterpotateをInterpotateに設定すると、カクつきを低減できるので、必ず覚えておきましょう。
理由は以下参照
そして、最後に注意する点は、PhotonRigidbodyViewとPhotonTransformViewClassicは同時に付けない方が安定するようです。ここまでできると以下のようにスムーズに同期することができます。
アイキャッチ画像はもこさん作です。素敵な画像をありがとうございました。