Unity/기능 구현

[Unity] 포톤 룸리스트 / 룸에 있을때 룸 리스트 가져오기(RoomListUpdate)

퐁스팡스 2022. 6. 12. 21:57

 

 

 

 

먼저 포톤에서 룸리스트를 가져오는 일반적인 방식이다.

Network.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

public class Network : MonoBehaviourPunCallbacks
{
    void Start()
    {
        PhotonNetwork.ConnectUsingSettings();
    }

    public override void OnConnectedToMaster()
    {
        Debug.Log("서버 연결");
        PhotonNetwork.JoinLobby();
    }

    public override void OnJoinedLobby()
    {
        Debug.Log("로비 연결");
        PhotonNetwork.JoinRandomOrCreateRoom();
    }

    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        // 룸 리스트 콜백은 로비에 접속했을때 자동으로 호출된다.
        // 로비에서만 호출할 수 있음...
        Debug.Log($"룸 리스트 업데이트 ::::::: 현재 방 갯수 : {roomList.Count}");
    }

    public override void OnJoinedRoom()
    {
        Debug.Log("방 연결");
    }
}


실행 후 로그를 보면

로비에 접속된 후에 룸리스트 업데이트가 호출된걸 볼 수 있다.

 

 

룸에 있을때 룸리스트를 가져와야하는 상황에...?

(RoomListUpdate는 로비에서만 호출할 수 있음;;)

LoadBanancingClient를 사용하여 룸안에서 리스트를 가져올 수 있는데

LoadBanancingClient서브클라이언트라고 생각하면 이해하기 쉽다.

 

RoomPuller.cs


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ExitGames.Client.Photon;
using Photon.Realtime;
using Photon.Pun;
using System;

public class RoomPuller : MonoBehaviourPunCallbacks
{
    Action<List<RoomInfo>> callback = null;
    LoadBalancingClient client = null;

    private void Update()
    {
        if (client != null)
        {
            // 반복문에서 service 함수를 호출해줘야 서브클라이언트에 연결이 유지됨
            client.Service();
        }
    }

    public void OnGetRoomsInfo(Action<List<RoomInfo>> callback)
    {
        // 서브클라이언트를 마스터 서버에 접속시킨다.
        this.callback = callback;
        client = new LoadBalancingClient();
        client.AddCallbackTarget(this);
        client.StateChanged += OnStateChanged;
        client.AppId = PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime;
        client.AppVersion = PhotonNetwork.NetworkingClient.AppVersion;
        client.EnableLobbyStatistics = true;

        // 포톤 세팅에서 접속 지역을 설정해주어야 한다. (FixedRegion 세팅하기)
        client.ConnectToRegionMaster(PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion);
    }

    void OnStateChanged(ClientState previousState, ClientState state)
    {
        Debug.Log("서브 클라이언트 상태 : " + state);

        // 서브클라이언트가 마스터 서버에 접속하면 로비로 접속 시킨다.
        if (state == ClientState.ConnectedToMasterServer)
        {
            client.OpJoinLobby(null);
        }
    }
    
    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        Debug.Log("서브 클라이언트 룸리스트 업데이트");

        if (callback != null)
        {
            callback(roomList);
        }
        // 모든 작업이 끝나면 서브 클라이언트 연결 해제
        client.Disconnect();
    }
}


 

 

Network 스크립트에 PullRoomList라는 함수를 추가하여 버튼에 할당하였다.

 

Network.cs


public void PullRoomList()
    {
        RoomPuller roomPoller = gameObject.AddComponent<RoomPuller>();
        roomPoller.OnGetRoomsInfo
        (
            (roomInfos) =>
            {
                // 룸리스트를 받고나서 작업 코드 넣기
                Debug.Log($"현재 방 갯수 : {roomInfos.Count }");
                
                // 마지막엔 오브젝트 제거해주기
                Destroy(roomPoller);
            }
        );
    }


 

 

 

 

이제 테스를 해보자!

 

 

 

룸에 접속한 상태에서 룸리스트 가져오기 버튼을 눌러보면

 

서브 클라이언트가 룸리스트를 가져오는 것을 확인 할 수 있다!

시간은 체감상 1초정도 걸리는듯 아무래도 서버에 연결하는 시간이 있으니...

 

 

 

혹시 아래 오류가 나오면 Fied Region이 설정이 안되어 있는 것이니 설정해주자

ConnectToRegionMaster() failed. The region can not be null or empty.

 

 

 

이 부분 에러

RoomPuller.cs

client.ConnectToRegionMaster(PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion);

 

 

고정 지역 서버 kr 기입하기

끝!