//tips
//Photonロビーからシーン遷移
ロビーの入室ボタンを押したらSampleルームに入り、その後ルームに二人揃ったら、Sampleシーンに遷移させるスクリプトを書いたが、Sampleルームに二人が入っている状態にもかかわらず、シーン遷移が発生しなかった点について、アドバイスをいただいたので進めていく。
public void JoinOrCreateRoom()のスクリプトの中にif (PhotonNetwork.CurrentRoom.PlayerCount == 2)の条件を入れているが、現在実行されてログも表示させているpublic override void OnJoinedRoom()の方に遷移条件を写した方が良さそうとのこと。
部屋を作る際には若干のタイムラグがあるのでそれが問題なのかもしれない。
下記の形にOnJoinedRoom()を変更した。
public override void OnJoinedRoom()
{
Debug.Log("OnJoinedRoom");
// 部屋の情報を表示
if (PhotonNetwork.InRoom)
{
Debug.Log("RoomName: " + PhotonNetwork.CurrentRoom.Name);
Debug.Log("HostName: " + PhotonNetwork.MasterClient.NickName);
Debug.Log("Slots: " + PhotonNetwork.CurrentRoom.PlayerCount + " / " + PhotonNetwork.CurrentRoom.MaxPlayers);
}
if (PhotonNetwork.CurrentRoom.PlayerCount == 2)
{
SceneManager.LoadSceneAsync("Sample", LoadSceneMode.Single);
PhotonNetwork.IsMessageQueueRunning = true;
}
}
これを実行する時片方のプレイヤーしかうまく遷移できなかったので、新しくルームに入ってくる人がいると呼ばれるOnPlayerEnteredRoom(Player newPlayer)の中にコードを移してみる。
public override void OnPlayerEnteredRoom(Player newPlayer)
{
Debug.Log("OnPlayerEnteredRoom");
if (PhotonNetwork.CurrentRoom.PlayerCount == 2)
{
SceneManager.LoadSceneAsync("Sample", LoadSceneMode.Single);
PhotonNetwork.IsMessageQueueRunning = true;
}
}
これも片方のみ遷移したので、OnJoinedRoom()とOnPlayerEnteredRoom(Player newPlayer)の両方ともにコードを残してみたら両方がきちんと遷移した。
//プレイヤーで区別可能なインベントリの作成方法
個別プレイヤーの生成はSampleシーンのsampleスクリプトから生成されているので、同様にprefab化すれば同じことができるのではないかと考える。
PhotonNetwork.Instantiate("GamePlayer", v, Quaternion.identity);の後ろにPhotonNetwork.Instantiate(“Inventory”, v, Quaternion.identity);として追加する。
Canvasの子要素として生成するため
ui_clone.transform.SetParent(this.canvas.transform,false);も記載する。
こちらの方法でcanvas傘下も自動生成できるようになったが、インベントリーを個別に分けることはできず、別途下記のエラーも生じた。
NullReferenceException: Object reference not set to an instance of an object
InventoryUI.UpdateUI () (at Assets/Script/InventoryUI.cs:18)
Inventory.Start () (at Assets/Script/Inventory.cs:26)
ネットワークの同期関係について質問中。
//ロビーからターゲットのシーンへの遷移
現在はroom2ロビーの入室ボタンを押すとSampleSceneに遷移するので、これをSampleScene2,3などに遷移先を変更してみる。
新規シーンroom3を作成し、canvas下を見直す。EnterButtonをクリックした際に発動するメソッドをJoinOrCreateroomではなく、OnJoinedRoom()へ変更。
メソッド内の遷移部分をSceneManager.LoadSceneAsync("Sample3”, LoadSceneMode.Single);へ変更。
下記エラーが発生。
NullReferenceException: Object reference not set to an instance of an object
NetworkManagerB.OnJoinedRoom () (at Assets/NetworkManagerB.cs:208)
以前はif (PhotonNetwork.InRoom)以下のHost nameなどがコンソールに表示されていたがされなくなっている。
デバッグで辿っていくと、「room Sampleに入りました」などの文言がなく、そもそもルームがないのではないかと考える。
EnterButtonのクリックを元のJoinOrCreateroomに戻すとどうなるか確認する。ルーム名はsampleのままで遷移先をsample scene3に変更する。
無事にsample scene3に遷移することができた。ただプレイヤーオブジェクトが生み出されないので、そちらを修正していく。
まずは先の遷移後にDebug.Logがどこまで読まれているかを確認する。
シーン遷移後のコンソールを確認したところ、PhotonNetwork.InstantiateをするOnJoinedRoom()は呼ばれておらず、呼ばれていたのはStart()のみであった。
なのでStart()メソッドへと下記を移動させて、挙動がどうなるか確認する。
// マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する
var v = new Vector3(Random.Range(-3f, 3f), Random.Range(1f, 2f));
PhotonNetwork.Instantiate("GamePlayer", v, Quaternion.identity);
GameObject ui_clone = PhotonNetwork.Instantiate("Inventory", v, Quaternion.identity);
GameObject canvas = GameObject.Find("Canvas");
//canvasの子に指定
ui_clone.transform.SetParent(canvas.transform, false);
これにより入室後に同期させることができた。
なぜか2人しかいないはずなのに3つ目のオブジェクトが発生している問題や下記のエラーが出ている点を検証していくことになる。
ConnectUsingSettings() failed. Can only connect while in state 'Disconnected'. Current state: Connected
UnityEngine.Debug:LogWarning(Object)
Photon.Pun.PhotonNetwork:ConnectUsingSettings(AppSettings, Boolean) (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:1081)
Photon.Pun.PhotonNetwork:ConnectUsingSettings() (at Assets/Photon/PhotonUnityNetworking/Code/PhotonNetwork.cs:1074)
SampleScene1125:Start() (at Assets/SampleScene1125.cs:11)
NullReferenceException: Object reference not set to an instance of an object
InventoryUI.UpdateUI () (at Assets/Script/InventoryUI.cs:18)
Inventory.Start () (at Assets/Script/Inventory.cs:26)