//tips
//システム微調整
開始画面のボタンのフォントを変更し、点滅する仕様を追加する。
GoogleのOswaldフォントをダウンロードし、アタッチ、テキストサイズを拡大し、背景はなくす。
スクリプトでテキストを点滅させる。
こちらのスクリプトをテキストにアタッチした。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Blink : MonoBehaviour
{
public float speed = 1.0f;
private Text text;
private float time;
void Start()
{
text = this.gameObject.GetComponent<Text>();
}
void Update()
{
text.color = GetAlphaColor(text.color);
}
Color GetAlphaColor(Color color)
{
time += Time.deltaTime * 5.0f * speed;
color.a = Mathf.Sin(time) * 0.5f + 0.5f;
return color;
}
}
今までdemoは一つしか使えないと思っていたが、buildの際に保存する名前を変更するだけで複数画面表示することができることがわかった。demo-demo3まで作成することで、4プレイヤー分の挙動を確かめることができる。demoの実行は保存先でファイルをクリックすればよく、demo同士の同期もきちんとできた。
4人対戦ができるようにroomの遷移条件も変えていく。
ボタンにアタッチされているNetworkManagerBスクリプトのコールバックメソッドを一部変更。
public override void OnPlayerEnteredRoom(Player newPlayer)
{
Debug.Log("OnPlayerEnteredRoom");
if (PhotonNetwork.CurrentRoom.PlayerCount == 4)
{
//SceneManager.LoadSceneAsync("Env2", LoadSceneMode.Single);
SceneManager.LoadSceneAsync(PhotonNetwork.CurrentRoom.Name, LoadSceneMode.Single);
PhotonNetwork.IsMessageQueueRunning = true;
}
}
同時に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);
PhotonNetwork.IsMessageQueueRunning = true;
}
}
各ボタンのプレイヤー数テキスト表示を扱うRoomlistscountスクリプトの分母を4に変更。
これでLobbyでの表示および遷移は4人で行われるようになっているはず。demoを再度生成し直す。
なぜか2/4までしか進めず、それ以降は入室ボタンを押しても反応しない現象が起きた。入室が2里以上できないような制約がかかっていないか確認する。
他のルームボタンを誤クリックしたためかと確認したが違うよう。
スクリプトではなくインスペクターのデフォルト設定が2のままになっているため、そちらが反映されていた模様。
無事に遷移の方確認できた。
最初にルームに入った場合、後のルームのプレイヤー数状況がうまく取得できていないので、public override void OnPlayerEnteredRoom(Player newPlayer)を受け取った場合もチェックを実施するようにする。
下記のようにroomリストを取得し、各のルームのカウントを取得するようにした。
public override void OnPlayerEnteredRoom(Player newPlayer)
{
foreach (RoomInfo room in PhotonNetwork.GetRoomList())
{
if (room.Name == "Env2")
{
countbuttontext[0].GetComponent<Text>().text = room.PlayerCount + " / 4";// + PhotonNetwork.CurrentRoom.MaxPlayers;
}
if (room.Name == "env22")
{
countbuttontext[1].GetComponent<Text>().text = room.PlayerCount + " / 4";// + PhotonNetwork.CurrentRoom.MaxPlayers;
}
if (room.Name == "env23")
{
countbuttontext[2].GetComponent<Text>().text = room.PlayerCount + " / 4";// + PhotonNetwork.CurrentRoom.MaxPlayers;
}
if (room.Name == "4")
{
countbuttontext[3].GetComponent<Text>().text = room.PlayerCount + " / 4";// + PhotonNetwork.CurrentRoom.MaxPlayers;
}
if (room.Name == "5")
{
countbuttontext[4].GetComponent<Text>().text = room.PlayerCount + " / 4";// + PhotonNetwork.CurrentRoom.MaxPlayers;
}
}
PhotonNetwork.GetRoomList()に対して、NotImplementedException: The method or operation is not implemented.が返ってきた。
OnReceivedRoomListUpdateが呼ばれた以後でないと
GetRoomList()にデータが入らない仕様とのこと、ここでRoomListUpdateの問題に戻ってきた。
ロビーに入っていないとRoomListUpdateは呼ばれないという記述があったので、ロビーにh入っていることを確認。SceneMoveスクリプトにてロビーにjoinするメソッドは記載しているので全てのシーンでロビーには入室している。
private void JoinLobby()
{
if (PhotonNetwork.IsConnected)
{
PhotonNetwork.JoinLobby();
Debug.Log("ロビーに入りました");
}
}
それでもOnRoomListUpdate()が呼ばれない理由は、You are automatically leaving any lobby when you join a roomと、ルームに入ってしまったらロビーから抜けてしまうからであることがわかった。
とすると、先にルームに入ってしまったらルーム情報を受け取れなくなる。
これは別の方法を考える必要がありそう。RPCで同期メソッドを実行するか、ルーム入室者は入室画面に遷移するようにするかでの処理を行えそう。
今回はせっかくなのでロビーにいながら入室者の数も確認できる方法を継続して探してみる。