먼저 포톤에서 룸리스트를 가져오는 일반적인 방식이다.
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 기입하기
끝!
'Unity > 기능 구현' 카테고리의 다른 글
[Unity] 오브젝트 위에 UI그리기(NPC 이름, 말풍선) (0) | 2022.09.04 |
---|---|
[Unity]유니티 카카오톡 채팅창 말풍선 코드없이 간편하게 구현하기! (1) | 2022.06.19 |