-
[Tip] 게임 룸 Name의 고유값 발급카테고리 없음 2020. 4. 25. 16:15
Photon PUN2에서 자동매칭이 아닌 수동 매칭 기능을 구현하다보면, 방 참가를 할 때 Room Name으로 참여를 해야함을 알 수 있다. 문제는 Room Name이 고유한 값이어야 한다는 것.
때문에 무작정 게시판 Title처럼 게임룸 Name을 덜컥 설정해버리면 곤란하다.
... public override void OnJoinRandomFailed(short returnCode, string message) { ExitGames.Client.Photon.Hashtable hashtables = new ExitGames.Client.Photon.Hashtable(); hashtables.Add("RoomName", PhotonNetwork.LocalPlayer.NickName + "'s Game"); string[] propertiesListedInLobby = new string[1]; propertiesListedInLobby[0] = "RoomName"; PhotonNetwork.CreateRoom( PhotonNetwork.LocalPlayer.UserId + "_" + System.DateTime.UtcNow.ToFileTime(), new RoomOptions { MaxPlayers = 4, IsVisible = true, IsOpen = true, CustomRoomProperties = hashtables, CustomRoomPropertiesForLobby = propertiesListedInLobby }) ; } ...
여러가지 방법이 있겠지만, 여기서는 UserId + UtcTime 값을 조합해서 고유한 값을 만들어보겠다. userId는 Photon PUN2에서 발급하는 유저의 고유한 값이다. 여기에 UtcTime을 fileTime, 즉 Long 형태의 값으로 뒤에다가 붙이는데 대랴걱인 형태는 다음과 같다.
171e48e4-1bbc-4f0d-bbd9-5304e51095ea_132322660706568650
제법 길다. 다만 이 값이 유저한테 직접 노출이 된다면 유저는 충격과 공포를 느낄 수 밖에 없기에 CustomRoomProperties를 이용해서 보여주도록 하자.
한가지 특이한 점은 CustomRoomProperties가 모두 Lobby에 내려오는 것이 아니다.
CustomRoomPropertiesForLobby에서 Lobby로 내려보낼 "키값"을 정해주어야 하는데, 이 내용이 가이드 문서에도 굉장히 부실하게 적혀있어서 찾는데 한참을 헤맸었다.
... public override void OnRoomListUpdate(List<RoomInfo> roomList) { // 코드가 생략되어 있지만, 당연히 기존 리스트를 삭제 후에 갱신해야 한다. for (int i = 0; i < roomList.Count; i++) { RoomInfo obj = roomList[i]; // 게임룸 대기실에서 유저가 전부 나간 경우, 종종 0/0 형태의 룸이 리스트로 넘어온다. // 이를 목록에서 제거하기 위한 방편 if (obj.MaxPlayers == 0 || obj.PlayerCount == 0) { continue; } // 미리 지정된 prefab를 Instantiate 한다. GameObject newRecord = Instantiate(GameRoomRecordPrefab); // GameRoomRecord (스크립트 컴포넌트)를 찾는다. GameRoomRecord grr = newRecord.GetComponent<GameRoomRecord>(); if (grr != null) { // 해당 컴포넌트에 RoomInfo를 전달한다. grr.setGameRoomInfo(obj); } // 부모 설정 (ScrollRect 내에 넣었다.) newRecord.transform.SetParent(scrollRect.content.transform, false); } } ...
스크롤뷰의 조정은 따로 유니티 UI 부분으로 묶어 팁을 정리할 생각이다.
... public class GameRoomRecord : MonoBehaviour { public Text gameRoomNameText; public Text PlayersCountText; public Button JoinButton; RoomInfo roomInfo; public void setGameRoomInfo(RoomInfo roomInfo) { this.roomInfo = roomInfo; gameRoomNameText.text = (string)roomInfo.CustomProperties["RoomName"]; PlayersCountText.text = roomInfo.PlayerCount + " / " + roomInfo.MaxPlayers; } } ...
이제 RoomName을 CustomProperties에서 받아오면 된다.