プログラミング系のネタをまとめていきます。

コンポーネント

PhotonNetwork

  • ロビー、ルーム管理
  • ユーザー管理
  • 通信処理管理
等を行うための staticクラス。

http://doc-api.exitgames.com/en/pun/current/pun/do...

PhotonView


ネットワーク上で同期を取る必要のあるオブジェクトにアタッチする。
同期を取るコンポーネントは 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();
    }
}

PhotonTransformView


Transformの同期に特化したコンポーネント。
GameObjectにアタッチするだけで(PhotonVeiewも必要)、座標の同期処理を実装できる。
様々な補間計算が用意されていて、インスペクタ上で設定するだけでOK。

PhotonAnimatorView


メカニムの同期に特化したコンポーネント。
GameObjectにアタッチするだけで(PhotonVeiewも必要)、アニメーションの同期処理を実装できる。
インスペクタ上で、同期したいメカニムのパラメータを選択する。

PhotonView 関連の注意点


ネットワーク設定でUDPプロトコルを選択している場合、パケロスが発生する事があります。
座標など、完全な同期をとる必要がない場合は問題無いですが、
イベント等パケロスが発生したら困る場合はTCPプロトコルを利用するか、独自で対応するか、RPCを利用する事になります。

RPC


remote procedure call
ネットワーク上の別の端末の関数等を呼び出す仕組み。

Unityドキュメントより RPC は高い信頼性で送信され、順序付けられます
http://docs.unity3d.com/ja/current/Manual/class-Ne...

呼び出し方

GameObjectの構成
  • GameObject
    • PhotonView … RPC呼び出しの橋渡し
    • Photon.MonoBehaviour継承のクラス … RPCメソッドを実装する

RPCメソッドの実装

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メソッドの呼び出し

マスタークライアントは即座にメソッドが呼び出されるが、
ネットワーク越しのプレイヤーには当然呼び出されるまでにラグが発生する。

// 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);						// 引数
}

RPCの引数に使える型


  • byte, int, float 等の値型
  • byte[], int[], float[] 上記値型の配列
  • string, string[]
  • Vecter3, Quaternion

また、以下のドキュメントにPhotonでシリアライズ可能な型の一覧があります。
確認してないですが、おそらく可能だと思われます。
http://doc.exitgames.com/ja/realtime/current/refer...

Menu

メインコンテンツ

プログラミング

機器

Macツール

各種情報

Wiki内検索

おまかせリンク

Androidアプリ

AdSense

技術書


管理人/副管理人のみ編集できます