このチャプターの目次
ルームに参加した後にシーン遷移する際の注意点
先にルームに参加している他プレイヤーのネットワークオブジェクトは、マッチング直後のアクティブなシーンに生成されます。もしマッチング後にシーン遷移を行い、ネットワークオブジェクトを保持するシーンが破棄されると、ネットワークオブジェクトも同時に破棄されてしまいます。これはそのまま他プレイヤーが表示されないバグに繋がります。問題を回避するためには、他プレイヤーのネットワークオブジェクトが生成される(厳密にいうと、サーバーから受信したオブジェクト生成メッセージを処理する)タイミングを、シーン遷移後にする必要があります。
ここで使用するのが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
は、メッセージの受信自体を止めるわけではないことに注意してください。処理を止めている間に受信したメッセージは内部のキューにためられ、再開した後に全て受信した順に処理が行われます。処理を止めている時間が長すぎると、その分だけ大量の受信メッセージがため込まれ、再開時に大量の処理が行われてしまうので、十分に気を付けましょう。