ジェイのブログ

Unity,UnrealEngine,ゲーム制作,プログラミング,日記も書きます!

【PhotonPUN2】1スクリプトでロビー作成、入室、選択、マッチングができる方法

 以下のソースを空のスクリプトに貼るだけで実装できます。

```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, "");
        }
    }
}

 ```