ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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에서 받아오면 된다.

     

     

     

    댓글

Designed by Tistory.