部屋一覧用要素プレハブ
以下のような、部屋の一覧表示をする際に一覧の部屋それぞれの情報を表示するオブジェクトのプレハブを作成します。
今回部屋一覧のオブジェクトに必要な要素は、以下の4つです。
- 部屋名...ルーム作成者が部屋につけた名前
- 人 数...ルームの最大入室可能人数
- 作成者...ルームの作成者の名前
- 入室用ボタン
これらのデータをインスタンス生成直後に読み込む必要があります。
RoomElementのInspector
Layout ElementはRoomElementプレハブの大きさを調節するためのコンポーネントです。
ここではこのオブジェクトの高さを50に設定しています。
RoomElementScript.csのソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RoomElementScript : MonoBehaviour { //Room情報UI表示用 public Text RoomName; //部屋名 public Text PlayerNumber; //人数 public Text RoomCreator; //部屋作成者名 //入室ボタンroomname格納用 private string roomname; //GetRoomListからRoom情報をRoomElementにセットしていくための関数 public void SetRoomInfo(string _RoomName,int _PlayerNumber,int _MaxPlayer,string _RoomCreator) { //入室ボタン用roomname取得 roomname = _RoomName; RoomName.text ="部屋名:"+_RoomName; PlayerNumber.text ="人 数:" +_PlayerNumber+"/"+_MaxPlayer; RoomCreator.text = "作成者:"+_RoomCreator; } //入室ボタン処理 public void OnJoinRoomButton() { //roomnameの部屋に入室 PhotonNetwork.JoinRoom(roomname); } } |
部屋情報表示用テキストオブジェクトとして子オブジェクトであるRoomName、PlayerNumber、RoomCreatorを設定しています。
SetRoomInfoによるルーム情報の取得処理は、この後作成するLobbyManagerオブジェクトのLobbyManagerScript内で呼び出されます。
RoomButtonのInspector(RoomElementの子オブジェクト)
RoomButtonをクリックすることでその部屋に入ることができます。
ログインボタンのアイコン(EnterRoom_icon)はicooon_mono様から以下の素材を利用させていただきました。
スポンサーリンク
LobbyUI
LobbyUIは先程作成した部屋作成用パネルの処理を管理するLobbyUIScriptを持ったオブジェクトです。
詳細はLobbyUIScriptのソースコードとLobbyUIのInspectorビューと設定をご覧ください。
LobbyUIScript.csのソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class LobbyUIScript : MonoBehaviour { //部屋作成ウインドウ表示用ボタン public Button OpenRoomPanelButton; //部屋作成ウインドウ public GameObject CreateRoomPanel; //部屋作成ウインドウ public Text RoomNameText; //作成する部屋名 public Slider PlayerNumberSlider; //最大入室可能人数用Slider public Text PlayerNumberText; //最大入室可能人数表示用Text public Button CreateRoomButton; //部屋作成ボタン // Update is called once per frame void Update () { //部屋人数Sliderの値をTextに代入 PlayerNumberText.text = PlayerNumberSlider.value.ToString(); } //部屋作成ウインドウ表示用ボタンを押したときの処理 public void OnClick_OpenRoomPanelButton() { //部屋作成ウインドウが表示していれば if (CreateRoomPanel.activeSelf) { //部屋作成ウインドウを非表示に CreateRoomPanel.SetActive(false); } else //そうでなければ { //部屋作成ウインドウを表示 CreateRoomPanel.SetActive(true); } } //部屋作成ボタンを押したときの処理 public void OnClick_CreateRoomButton() { //作成する部屋の設定 RoomOptions roomOptions = new RoomOptions(); roomOptions.IsVisible = true; //ロビーで見える部屋にする roomOptions.IsOpen = true; //他のプレイヤーの入室を許可する roomOptions.MaxPlayers = (byte)PlayerNumberSlider.value; //入室可能人数を設定 //ルームカスタムプロパティで部屋作成者を表示させるため、作成者の名前を格納 roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "RoomCreator",PhotonNetwork.playerName } }; //ロビーにカスタムプロパティの情報を表示させる roomOptions.CustomRoomPropertiesForLobby = new string[] { "RoomCreator", }; //部屋作成 PhotonNetwork.CreateRoom(RoomNameText.text,roomOptions,null); } } |
LobbyUIのInspectorビューと設定
上記の画像のように今まで作成したオブジェクトをドラッグ&ドロップで設定します。
LobbyManager
LobbyManagerは部屋一覧の表示とプレイヤーのルーム入室時や作成時の処理を管理するLobbyManagerScriptをもつオブジェクトです。
詳細はLobbyManagerScriptのソースコードとLobbyManagerのInspectorビューと設定をご覧ください。
LobbyManagerScript.csのソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using Hashtable = ExitGames.Client.Photon.Hashtable; namespace Com.MyCompany.MyGame { public class LobbyManagerScript : Photon.PunBehaviour { #region Public Variables //部屋一覧表示用オブジェクト public GameObject RoomParent;//ScrolViewのcontentオブジェクト public GameObject RoomElementPrefab;//部屋情報Prefab //ルーム接続情報表示用Text public Text InfoText; #endregion #region MonoBehaviour CallBacks void Awake() { //ルーム内のクライアントがMasterClientと同じシーンをロードするように設定 PhotonNetwork.automaticallySyncScene = true; } void Start() { //ルーム一覧取得 GetRooms(); } #endregion #region Public Methods public void GetRooms() { //roomInfoに現在存在するルーム情報を格納・更新 RoomInfo[] roomInfo = PhotonNetwork.GetRoomList(); //ルームが無ければreturn if (roomInfo == null || roomInfo.Length == 0) return; //ルームがあればRoomElementでそれぞれのルーム情報を表示 for (int i = 0; i < roomInfo.Length; i++) { Debug.Log(roomInfo[i].Name + " : " + roomInfo[i].Name + "–" + roomInfo[i].PlayerCount + " / " + roomInfo[i].MaxPlayers /*+ roomInfo[i].CustomProperties["roomCreator"].ToString()*/); //ルーム情報表示用RoomElementを生成 GameObject RoomElement = GameObject.Instantiate(RoomElementPrefab); //RoomElementをcontentの子オブジェクトとしてセット RoomElement.transform.SetParent(RoomParent.transform); //RoomElementにルーム情報をセット RoomElement.GetComponent<RoomElementScript>().SetRoomInfo(roomInfo[i].Name, roomInfo[i].PlayerCount, roomInfo[i].MaxPlayers, roomInfo[i].CustomProperties["RoomCreator"].ToString()); } } //RoomElementを一括削除 public static void DestroyChildObject(Transform parent_trans) { for (int i = 0; i < parent_trans.childCount; ++i) { GameObject.Destroy(parent_trans.GetChild(i).gameObject); } } #endregion #region Photon.PunBehaviour CallBacks //GetRoomListは一定時間ごとに更新され、その更新のタイミングで実行する処理 public override void OnReceivedRoomListUpdate() { DestroyChildObject(RoomParent.transform); //RoomElementを削除 GetRooms(); //RoomElementを再生成 } //ルーム作成失敗した場合 public override void OnPhotonCreateRoomFailed(object[] codeAndMsg) { //テキストを表示 InfoText.text = "ルームの作成に失敗しました"; } //ルームの入室に失敗した場合 public override void OnPhotonJoinRoomFailed(object[] codeAndMsg) { //テキストを表示 InfoText.text = "ルームの入室に失敗しました"; } //ルームに入室時の処理 public override void OnJoinedRoom() { //プレイヤーローカル変数初期化 LocalVariables.VariableReset(); } //ルーム作成時の処理(作成者しか実行されない) public override void OnCreatedRoom() { //battleシーンへ遷移 PhotonNetwork.LoadLevel("battle"); } #endregion } } |
LobbyManagerのInspectorビューと設定
LobbyManagerは以下の画像のように設定します。
最後にログイン画面のシーンと繋げる
LauncherシーンのLauncherScriptを以下のように変更する。
LauncherScript.csのソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class LauncherScript : Photon.PunBehaviour { #region Public変数定義 //Public変数の定義はココで #endregion #region Private変数 //Private変数の定義はココで string _gameVersion = "Chapter12"; //ゲームのバージョン。仕様が異なるバージョンとなったときはバージョンを変更しないとエラーが発生する。 #endregion #region Public Methods //ログインボタンを押したときに実行される public void Connect() { if (!PhotonNetwork.connected) { //Photonに接続できていなければ PhotonNetwork.ConnectUsingSettings(_gameVersion); //Photonに接続する Debug.Log("Photonに接続しました。"); SceneManager.LoadScene("Lobby"); //Lobbyシーンに遷移 } } #endregion } |
前回まではこのスクリプトの中でロビーに入ってルームに入室していましたが、今回からはLobbyシーンでどのルームに入室するか選択するので、Lobbyシーンに遷移するのみの処理としています。
実際に実行してみましょう!!
ログイン後、Lobbyシーンに遷移し、部屋一覧を取得できていますね!!
また自分で部屋も作成して入室することができました!!
次回予告!!
未定。何か思いつけば追記します。