//tips
//微調整
再度photonの同期部分を見直してみる。再度roleが適切に分配されない問題が発生。
各シーンのタイムカウントの開始時間のズレから、room入室および遷移タイミングにズレが生じており、他のプレイヤーがroomに入れていない状況で先にボタンをクリックしてしまっているため、同一room内にしか共有されないRPC同期がなされず、最初のプレイヤーなどがカウントされない現象が起こっているのではないかと仮定する。
そうすると全てのシーンでタイムカウントが進んでいる状況では逆に適切に配分されるはずなのでそちらを先に確認する。
全てのシーンのカウントが適切に進んでいる場合は問題なくroleの振り分けが行われた。
再度最初の入室・遷移者が他のシーンのカウントが始まる前にキャラクターピックを行うと、自身の順番がカウントされていないことが確認できたので、こちらの問題点であっているよう。
これはroom入室・遷移を全てが完了するまで待機させる設定を設けることで問題が解決するので、そちらの方法を考えていく。
非同期による遷移を組み込むことが問題かと考えたが、現在はSceneMoveスクリプトにて既に組み込んでいた。
public override void OnJoinedRoom()
{
Debug.Log("OnJoinedRoom");
if (PhotonNetwork.CurrentRoom.PlayerCount == 4)
{
Debug.Log("OnJoinedRoomCurrentRoom.PlayerCount");
//SceneManager.LoadSceneAsync("Env2", LoadSceneMode.Single);
SceneManager.LoadSceneAsync(PhotonNetwork.CurrentRoom.Name, LoadSceneMode.Single);
なので、どちらかというと遷移完了後の読み込みスピードの問題かと思うのでenv2シーン画面表示にloading画面を加え、各プレイヤーの足並みを揃えること、同時にタイマーのカウントをスクリプト読み込み時から、遷移完了時点のメソッド通知に変更することを行なっていく。
これは最初の入室者がRPCによるカウントを集計し、4プレイヤー分が集まった時点で開始となるよう設計する。
loadingcanvasをenv2シーンに作成し、photonviewをアタッチ。
そこからNowloadingphotonスクリプトを新たに作成。一旦下記が機能するか確認。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using Photon.Pun;
using Photon.Realtime;
public class Nowloadingphoton : MonoBehaviourPunCallbacks
{
[SerializeField]
private Slider slider;
public int startmember;
void Start()
{
photonView.RPC(nameof(NowActive), RpcTarget.All);
}
private void Update()
{
if (startmember==4)
{
photonView.RPC(nameof(closeloading), RpcTarget.All);
}
else
{
var progressVal = Mathf.Clamp01(startmember / 4);
slider.value = progressVal;
}
}
[PunRPC]
void NowActive()
{
startmember++;
}
[PunRPC]
void closeloading()
{
this.gameObject.SetActive(false);
}
}
startmemberが16になっており、シーンのスクリプト自体は読み込まれているよう。
タイマーの時間の読み込みタイミングに違いが生じている部分を突き止める必要がありそう。
タイマーのカウントの開始に関わるのはCharaUIchange2スクリプトでこちらもシーン上にアクティブな状態で設置されおり、下記の形でカウントをスタートさせている。
void Start()
{
seconds = 0f;
oldSeconds = 0f;
timer = timerText.GetComponent<Text>();
}
void Update()
{
seconds += Time.deltaTime;
CharaUIchange2スクリプトと Nowloadingphotonスクリプトの違いは[SerializeField]でアタッチされているオブジェクトおよびスクリプトがCharaUIchange2の方に多いことにある。
ボトルネックがCharaUIchange2スクリプトにあるとすると、CharaUIchange2スクリプトのstartメソッドを利用して、nowloadingスクリプト内メソッドを実施できないか考える。
再び最初に入室したプレイヤーのstartmemberが16と表示された。
何故16という数字が出てくるのかを突き止める必要が出てきた。
4人のシーン上のCharaUIchange2内startメソッド読み込まれ時に、全員に対してプラス1するようにしているので、4*4が生じているということは、
CharaUIchange2内startメソッドが各人1回ではなく4回読み込まれている
RPCで受け取った処理を各人が1回ではなく4回読み込んでいる
Roomの中にさらに4つのroomが作られ、合計16人存在することになっており、その影響で4回読み込まれている
のような問題が考えられる。
一旦env2シーンを単独で動かすためにアタッチしていたSampleSceneenv2スクリプトを非表示にして読み込まれないようにした。
また、今度は一人目ではなく二人目の遷移者となる形でログを確認する。
Unityエディターで二人目以降の遷移者となると若干タイムラグがあるものの問題なく表示されるようになった。
ただ、nowloadingの表示画面ではなくキャラクター選択画面が表示されたのちに、nowloadingが表示されてしまっているので、ヒエラルキーの順番を変更し、prefab状態からオリジナルに変更した。
closeloadingは実行され、一旦表示は消されている。
[PunRPC]
void Closeloading()
{
NowLoad.SetActive(false);
Debug.Log("closeloading");
}
にもかかわらず再度表示がされているのはシーンが再読み込みされていることを表す。
要因を探っていくと、非同期読み込みを使用しているときにシーンを2回重複して読み込むことがあることがわかってきた。
https://qiita.com/segur/items/b13045e6f3a9949e0503
https://www.javaer101.com/en/article/53265559.html