はじめに
Photon初心者が躓いた所をメモ。
ボタンをクリックで、GameManagerへの変更→Sceneの変更を行い、
それを同期をさせたかったので以下のようなコードを書いた。
GManaSceneChange.cs
using Photon.Pun;
using UnityEngine.SceneManagement;
public class GManaSceneChange : MonoBehaviourPunCallbacks
{
public void Reflesh()
{
// 全てのプレイヤーのGameManagerChangeを同期させる
photonView.RPC("GameManagerChange", RpcTarget.AllViaServer);
// 全てのプレイヤーのSceneChangeを同期させる
photonView.RPC("SceneChange", RpcTarget.AllViaServer);
}
[PunRPC]
private void GameManagerChange()
{
GameManager.instance.Deck = 16;
GameManager.instance.Hand = 0;
GameManager.instance.Dust = 0;
GameManager.instance.Public = 0;
}
[PunRPC]
private void SceneChange()
{
SceneManager.LoadScene("Load");
}
}
しかし
上記のではSceneChangeは同期するものの、gameManagerChangeは同期されないみたい。
そこで、以下のように処理と処理の間にディレイを挿入することで変更されるようになった。
GManaSceneChange.cs
using Photon.Pun;
using UnityEngine.SceneManagement;
public class GManaSceneChange : MonoBehaviourPunCallbacks
{
public void Reflesh()
{
StartCoroutine(DelayedSceneChange());
}
private IEnumerator DelayedSceneChange()
{
// 全てのプレイヤーのGameManagerChangeを同期させる
photonView.RPC("GameManagerChange", RpcTarget.AllViaServer);
// 0.3秒待機
yield return new WaitForSeconds(0.3f);
// 全てのプレイヤーのSceneChangeを同期させる
photonView.RPC("SceneChange", RpcTarget.AllViaServer);
}
[PunRPC]
private void GameManagerChange()
{
GameManager.instance.Deck = 16;
GameManager.instance.Hand = 0;
GameManager.instance.Dust = 0;
GameManager.instance.Public = 0;
}
[PunRPC]
private void SceneChange()
{
SceneManager.LoadScene("Load");
}
}
たぶん
GameManagerChangeが同期完了していないのに、SceneChange同期が始まってしまうから、
処理がキャンセルされているor同期前のデータを読み込んでしまってる?とかなのかな。
よくわからないけど、時間を挟むといいみたい。