[Unity]Photon Unity Networking2でのシーンの「リロード」方法

はじめに


Photon Unity Networking2(以下PUN2)を使用したゲームでシーンのリロード方法に苦戦したので備忘録として残しておきます。
(ネットで調べてもリロード方法に関しては見つからなかった)

アルゴリズム

PUN2のシーンロードについては

PhotonNetwork.AutomaticallySyncScene = true;
PhotonNetwork.LoadLevel("シーン名");

で同期することが出来ます。なので、シーンをリロードする時は

PhotonNetwork.LoadLevel("現在のシーン名");

でいいじゃん!と考えたのですが、結論から言うとできませんでした。

ホスト側ではシーンをリロードする事ができましたが、クライアント側はシーンを読み込みませんでした。(同期不可)

そこで、力技である事は否めませんがアルゴリズムを変える事にしました。

ダメパターン
これにしたい

シングルトンで現在のシーン名を渡し、ロードシーンで受け取ったシーン名を読み込む方法にすると上手く行きました。

//シーン名をシングルトンを使用して遷移先に送る
ActiveSceneName.Instance.GetSetSceneName = SceneManager.GetActiveScene().name;
if(PhotonNetwork.IsMasterClient) PhotonNetwork.LoadLevel("LoadScene");
//シーン遷移先の処理
if (PhotonNetwork.IsMasterClient) PhotonNetwork.LoadLevel(ActiveSceneName.Instance.GetSetSceneName);
      

追記

上記の方法で上手く行きましたが、処理速度によってはシーンの同期が追い付かずにバグを起こしてしまう可能性があります。
その時は、シーン遷移先の移行処理をクライアント側でRPC関数を呼び出すことによって解決します。

    private void Start()
    {
        //クライアントが呼び出す
        if (!PhotonNetwork.IsMasterClient) photonView.RPC(nameof(LoadScene), RpcTarget.AllBufferedViaServer);
    }

    [PunRPC]
    private void LoadScene()
    {
        //ホストが遷移
        if (PhotonNetwork.IsMasterClient)
        {
            PhotonNetwork.LoadLevel(ActiveSceneName.Instance.GetSetSceneName);
        }
    }


いいなと思ったら応援しよう!