Chapter 15

🌶 ルーム参加後のシーン遷移

o8que
o8que
2021.03.13に更新

後日加筆修正予定...

ルームに参加した後にシーン遷移する際の注意点

先にルームに参加している他プレイヤーのネットワークオブジェクトは、マッチング直後のアクティブなシーンに生成されます。もしマッチング後にシーン遷移を行い、ネットワークオブジェクトを保持するシーンが破棄されると、ネットワークオブジェクトも同時に破棄されてしまいます。これはそのまま他プレイヤーが表示されないバグに繋がります。問題を回避するためには、他プレイヤーのネットワークオブジェクトが生成される(厳密にいうと、サーバーから受信したオブジェクト生成メッセージを処理する)タイミングを、シーン遷移後にする必要があります。

ここで使用するのがPhotonNetwork.IsMessageQueueRunningプロパティです。このプロパティを設定することで、受信メッセージ処理の実行・一時停止を切り替えることができます。遷移前のシーンでfalseに設定し、

public override void OnJoinedRoom() {
    PhotonNetwork.IsMessageQueueRunning = false;

    SceneManager.LoadSceneAsync("Game", LoadSceneMode.Single);
}

遷移後のシーンでPhotonNetwork.IsMessageQueueRunningをtrueに戻すことで、他プレイヤーのネットワークオブジェクトが遷移後のシーンに正しく生成されるようになります。

private void Start() {
    PhotonNetwork.IsMessageQueueRunning = true;

    var v = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f));
    PhotonNetwork.Instantiate("GamePlayer", v, Quaternion.identity);
}

PhotonNetwork.IsMessageQueueRunningは、メッセージの受信自体を止めるわけではないことに注意してください。処理を止めている間に受信したメッセージは内部のキューにためられ、再開した後に全て受信した順に処理が行われます。処理を止めている時間が長すぎると、その分だけ大量の受信メッセージがため込まれ、再開時に大量の処理が行われてしまうので、十分に気を付けましょう。