以下のソースを空のスクリプトに貼るだけで実装できます。
```C#
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.SceneManagement;
public class CTitleManager : MonoBehaviourPunCallbacks
{
private string RoomName = "";
Rect LobbyGuiRect = new Rect(0, 0, 300, 200);
private const int MaxPlayerPerRoom = 3;
ExitGames.Client.Photon.Hashtable roomHash;
float time = 60.0f;
void Update()
{
LobbyGuiRect.x = Screen.width / 4;
LobbyGuiRect.y = Screen.height / 4;
LobbyGuiRect.width = Screen.width / 2;
LobbyGuiRect.height = Screen.height / 4;
}
// 接続したらロビーに入室する
public override void OnConnectedToMaster()
{
PhotonNetwork.JoinLobby();
}
//GetRoomListは一定時間ごとに更新され、その更新のタイミングで実行する処理
//ルームリストに更新があった時(ロビーに入ってるときのみ呼ばれる)
public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
RoomList = roomList;
}
List<RoomInfo> RoomList = new List<RoomInfo>();
void RoomNameUIWindow(int window_id)
{
// ルーム名の入力
GUILayout.BeginHorizontal();
GUILayout.Label("RoomName : ");
RoomName = GUILayout.TextField(RoomName, GUILayout.Width(200));
GUILayout.EndHorizontal();
// ルームを作成して入室する
if (GUILayout.Button("Create Room", GUILayout.Width(150)))
{
PhotonNetwork.CreateRoom(RoomName);
}
// ルーム一覧を検索
foreach (var room in RoomList)
{
// ルームパラメータの可視化
string room_param = $"{room.Name}{room.PlayerCount}/{((room.MaxPlayers == 0) ? "-" : room.MaxPlayers.ToString())}";
// ルームを選択して入室する
if (GUILayout.Button("Enter Room : " + room_param))
{
PhotonNetwork.JoinRoom(room.Name);
}
}
}
void PlayerNameUIWindow(int window_id)
{
// プレイヤー名の入力
GUILayout.BeginHorizontal();
GUILayout.Label("PlayerName : ");
PhotonNetwork.NickName = GUILayout.TextField(
(PhotonNetwork.NickName == null) ?
"" :
PhotonNetwork.NickName, GUILayout.Width(200));
GUILayout.EndHorizontal();
// MUNサーバに接続する
if (GUILayout.Button("Connect Server", GUILayout.Width(150)))
{
PhotonNetwork.AutomaticallySyncScene = true;
PhotonNetwork.ConnectUsingSettings();
}
}
void WaitPlayerUIWindow(int window_id)
{
time -= Time.deltaTime;
roomHash["Time"] = time;
PhotonNetwork.CurrentRoom.SetCustomProperties(roomHash);
float stage_time = (PhotonNetwork.CurrentRoom.CustomProperties["Time"] is float value) ? value : 0;
GUILayout.Label(stage_time.ToString());
foreach (var player in PhotonNetwork.PlayerList)
{
GUILayout.Label(player.NickName);
}
}
public override void OnJoinedRoom()
{
//ルームプロパティ設定
roomHash = new ExitGames.Client.Photon.Hashtable();
roomHash.Add("Time", time);
PhotonNetwork.CurrentRoom.SetCustomProperties(roomHash);
Debug.Log("ルームに参加しました");
int playerCount = PhotonNetwork.CurrentRoom.PlayerCount;
if (playerCount < MaxPlayerPerRoom)
{
Debug.Log("対戦相手を待っています。");
}
else
{
Debug.Log("対戦相手が揃いました。バトルシーンに移動します。");
}
}
public override void OnPlayerEnteredRoom(Player newPlayer)
{
if (PhotonNetwork.IsMasterClient)
{
if (PhotonNetwork.CurrentRoom.PlayerCount >= MaxPlayerPerRoom)
{
PhotonNetwork.CurrentRoom.IsOpen = false;
Debug.Log("対戦相手が揃いました。バトルシーンに移動します。");
PhotonNetwork.LoadLevel("ThirdPersonTest");
}
}
}
//ルームプロパティが変更されたときに呼ばれる
public override void OnRoomPropertiesUpdate(ExitGames.Client.Photon.Hashtable propertiesThatChanged)
{
object value = null;
//変更のあったプロパティに"Time"が含まれているならtimeを更新
if (propertiesThatChanged.TryGetValue("Time", out value))
{
time = (float)value;
}
}
void OnGUI()
{
// サーバに接続している場合
if (PhotonNetwork.IsConnected)
{
// ロビーに入室してる場合
if (PhotonNetwork.InLobby)
{
// ルームに入室していない場合
if (!PhotonNetwork.InRoom)
{
GUILayout.Window(1, LobbyGuiRect, RoomNameUIWindow, "");
}
}
else // ロビーに入室してない場合
{
// ルームに入室している場合
if (PhotonNetwork.InRoom)
{
GUILayout.Window(3, LobbyGuiRect, WaitPlayerUIWindow, "");
}
}
}
// PUNサーバに接続していない場合
else
{
GUILayout.Window(2, LobbyGuiRect, PlayerNameUIWindow, "");
}
}
}
```