読者です 読者をやめる 読者になる 読者になる

さんたのお中元

Unityでのゲーム開発について主に書いていきます

【PUN】"PhotonTargets.Others"の使い道

RPCをルーム内のクライアントに送る対象のひとつにOthersというのがあります。
これは自分以外のクライアントに関数が呼び出されます。

RPCは通常の関数と同じように引数を使うことができますが、PhotonTargets.Othersで送った場合、送った側のクライアントが保持している値をそのまま送ることができます。

一方、PhotonTargets.MasterClientでRPCをマスタークライアント以外が実行した場合、同じように自分以外のクライアントが関数を呼び出すことになりますが、この場合引数の値はマスタークライアントの値で実行されてしまいます。

例えば、各クライアントがPlayerPrefsクラスで保存したデータを使いたい場合、PhotonTargets.Othersを使うことが有効です。

コードは保存したユーザー名をマスタークライアント以外がマスタークライアントに送る例です。

//中略
PlayerPrefs.SetString ("MYNAME", "YAMADA");//PlayerPrefsクラスで名前を保存
//中略

//同期したい変数
string guestname = "";

//入室時
void OnJoinedRoom(){
    //マスタークライアントではないとき
	if (!PhotonNetwork.isMasterClient) {
		guestname = PlayerPrefs.GetString ("MYNAME");
		photonView.RPC("SendName", PhotonTargets.Others, guestname);//引数には"YAMADA"が入っている
	}
}

[RPC]
void SendName(string playername){
	guestname = playername;
}

photonView.RPC("SendName", PhotonTargets.Others, guestname);
のところを、
photonView.RPC("SendName", PhotonTargets.MasterClient, guestname);
とすると、マスタークライアントが保持しているguestnameの値は変更されません。

このように、PhotonTargets.OthersはPlayerPrefsで保存した値を同期させるのに便利ですね。