最終更新:
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...


最新コメント