[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);
}
}