最終更新: bokkuri_orz 2015年06月24日(水) 01:44:03履歴
ネットワーク上で同期を取る必要のあるオブジェクトにアタッチする。
同期を取るコンポーネントは Photon.MonoBehaviour を継承し、
インスペクタのPhotonView - Observed Componets に登録する。
登録されたコンポーネントは OnPhotonSerializeView イベントが呼ばれるようになる。
以下、OnPhotonSerializeViewの実装例。
void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.isWriting) { // ローカルプレイヤー(他のプレイヤーへ情報を送信するので、ストリームに書き込む) stream.SendNext(transform.position); stream.SendNext(transform.rotation); } else { // ネットワーク上のプレイヤー(自分以外のプレイヤーの情報。ネットワーク経由で情報を受け取る) this.correctPlayerPos = (Vector3)stream.ReceiveNext(); this.correctPlayerRot = (Quaternion)stream.ReceiveNext(); } }
Transformの同期に特化したコンポーネント。
GameObjectにアタッチするだけで(PhotonVeiewも必要)、座標の同期処理を実装できる。
様々な補間計算が用意されていて、インスペクタ上で設定するだけでOK。
メカニムの同期に特化したコンポーネント。
GameObjectにアタッチするだけで(PhotonVeiewも必要)、アニメーションの同期処理を実装できる。
インスペクタ上で、同期したいメカニムのパラメータを選択する。
ネットワーク設定でUDPプロトコルを選択している場合、パケロスが発生する事があります。
座標など、完全な同期をとる必要がない場合は問題無いですが、
イベント等パケロスが発生したら困る場合はTCPプロトコルを利用するか、独自で対応するか、RPCを利用する事になります。
remote procedure call
ネットワーク上の別の端末の関数等を呼び出す仕組み。
Unityドキュメントより RPC は高い信頼性で送信され、順序付けられます
http://docs.unity3d.com/ja/current/Manual/class-Ne...
public class TestRPC : Photon.MonoBehaviour { [PunRPC] public void RPCFunc(string msg, byte[] data, PhotonMessageInfo info) { Debug.Log("Message : " + msg); string dataStr = ""; foreach(byte b in data) dataStr += b + " "; Debug.Log("Data : " + dataStr); } }
※PUN ver1.56からは [RPC] が使えなくなっています。代わりに[PunRPC]を使います。
http://forum.unity3d.com/threads/photon-unity-netw...
v1.56 (16. June 2015) Changed: The RPC attribute got replaced by PunRPC. Search and replace your code for [RPC] and replace it with [PunRPC] (in JS: @RPC and @PunRPC). The change is necessary, because the RPC attribute is obsolete in Unity 5.1 and that causes a large amount of warnings at compile time. The new PunRPC must be used in all versions of Unity, starting with this PUN version.
マスタークライアントは即座にメソッドが呼び出されるが、
ネットワーク越しのプレイヤーには当然呼び出されるまでにラグが発生する。
// RPCを呼び出す { PhotonView view; // TestRPC + PhotonViewを持つGameObjectから取得する // RPCメソッドの引数 object[] の配列にする object[] args = new object[]{ "RPC message", // 第1引数 : string msg new byte[] {1, 2, 3} // 第2引数 : byte[] data }; // RPCメソッドの名前、引数を合わせる view.RPC( "RPCFunc", // メソッド名 Photontargets.All, // ネットワークプレイヤー全員に対して呼び出す args); // 引数 }
- byte, int, float 等の値型
- byte[], int[], float[] 上記値型の配列
- string, string[]
- Vecter3, Quaternion
また、以下のドキュメントにPhotonでシリアライズ可能な型の一覧があります。
確認してないですが、おそらく可能だと思われます。
http://doc.exitgames.com/ja/realtime/current/refer...
最新コメント