PhotonUnity技術ブログ

Photonの各種デモの解説 DemoRPGMovement編

こんばんは、ごきげんよう。
Unityエンジニアの平田です。
(普段はアプリの開発秋葉原にあるコワーキングスペースでUnityの勉強会を主催しています。)

ここでは、前回Photonの概要の説明の続きから
各種デモシーンの細かい解説を行って行こうかと思います。

今回は「DemoRPGMovement」の解説を行います。

こちらのデモでは、キャラクターアバターを同期させて複数人でフィールドを自由に移動する周辺の処理について把握することができます。

それでは、こちらのデモ中に含まれるScriptやPrefabについて解説していきます。

■Prefab

Robot Kyle RPG.prefab
(Photon Unity Networking/Demos/DemoRPGMovement/Resources/Robot Kyle RPG.prefab にある)

本デモでプレイヤーの分身として使われているもの

RPGMoveMent.cs,

Animator,

CharacterController,

PhotonView,

PhotonTransformView

がアタッチされている

DemoRPGMovement.csのOnJoinedRoom(Photonの部屋入室時に呼ばれる)
から生成されている。
PhotonView.csとPhotonTransformView.csから


各プレイヤーの操作に応じてTransformの同期処理が行われている。

■スクリプト
PhotonView.cs
Photonの同期を行うための非常に重要なスククリプト
基本的に同期を行うオブジェクトにアタッチして使用します。

RPCを打ったり、ObservedComponentsで指定したオブジェクトのパラメーターを同期したりすることができます。
詳しくは公式リファレンスを参照

PhotonTransformView.cs
Transform周りの同期をサポートするためのPhotonからの提供コンポーネント
このスクリプトを対象にアタッチした後に、
同期キャラクターにアタッチしたPhotonView.csのインスペクター
のObservedComponentsにPhotonTransformViewを追加する

(今まではOnPhotonSerializeViewでパラメータ同期を手書きで行っていたところを
Transform周りに限っては簡略化することが可能になります。)

PostionとRotationとScaleにチェックを入れることができ、チェックが入っている値が同期可能になります。

(PhotonView.csのObservedComponentsに対象オブジェクトのTransformを直接入れての同期も可能ですが、本PhotonTransformView.csを同期対象とすることでフレーム補完などもスクリプト中で行ってくれるようになります。)

 

RPGMovement.cs

(キー入力とキャラクターのアニメーション更新用のスクリプト)
m_PhotonView.isMineのとき(自分が所持しているオブジェクトのときのみ)
キー操作を受け付けて移動などの処理を受け付けるようになっている
(この判定によって、他のプレイヤーの所有オブジェクトはキー入力を受け付けないようになっています。)
また、このスクリプト中のUpdateAnimationの処理によって
(毎フレーム実行され、かつm_PhotonView.isMine関係なく行われる)
キャラクターのアニメーションが同期されます。
(キャラクターの移動量に応じて、Animatorの SpeedやDirectionが切り替わるようになっています。)

 

RPGCamera.cs
プレイヤーキャラクターにMainCameraを追従させるためのスクリプト
キー入力の値を受け取って位置を調整している。
Photon周りの処理とは特に関連はない

 

ConnectAndJoinRandom.cs
Photonのサンプルプロジェクトに含まれているスクリプト

本デモシーンでは、ゲームシーン中のControl Objectsゲームオブジェクトにアタッチされている


部屋の作成か、部屋への入室をランダムに行う。
処理のフローは以下

・既存の存在している部屋にランダムに入室を行う。
↓部屋がまだ存在しない場合や、入ろうとした部屋が満パンで入れなかった場合
(このスクリプト中では4人に設定してある)
・新たに部屋を作成し入室を行う

 

ShowStatusWhenConnecting.cs

本デモシーンでは、ゲームシーン中のControl Objectsゲームオブジェクトにアタッチされている


Photonmへの接続状況をGUIで画面上に表示するためのスクリプト

DemoRPGMovement.cs

本デモシーンでは、ゲームシーン中のControl Objectsゲームオブジェクトにアタッチされている


Photonの同期オブジェクトを生成するためのスクリプト
OnJoinedRoom()で
↓Photon入室時のコールバックを受け取り指定した処理を実行できます。
このスクリプト中では
CreatePlayerObjectを呼んでおり、こちらの処理中で
PhotonNetwork.Instantiate
を呼び出し、Photon同期用のPrefabを読み込んでいます。
また、こちらのメソッドで生成された同期用のオブジェクトは
PhotonView.isMineがTrueになります。

(生成したプレイヤーの所持オブジェクトになる)

 

※注意! PhotonNetwork.Instantiateで呼び出す対象のPrefabは、
Resourcesの直下に置く必要があった気がします!
(現在はもしかしたら違うかも・・・!)