• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (121)
      • Unity (80)
        • RPG Project (39)
        • FPS Project (30)
        • 기타 - 개발 (11)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (5)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Photon] 방 상태 추가
        2025년 06월 19일
        • SiJun-Park
        • 작성자
        • 2025.06.19.:39

        이제 방상태에 따라서 입장이 가능하거나 불가능하게 만들 필요가 있어서 구현을 하였습니다.

         

            public void OnCreateRoom()
            {
                SoundManager.Instance.ClickButton();
                RoomOptions roomOptions = new RoomOptions();
                roomOptions.MaxPlayers = byte.Parse(RoomCapacityInputField.text);
                roomOptions.IsOpen = true;
                roomOptions.IsVisible = true;
        
                roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable { { "RoomState", "Waiting" } };
                roomOptions.CustomRoomPropertiesForLobby = new string[] { "RoomState" };
        
                PhotonNetwork.CreateRoom(RoomNameInputField.text, roomOptions );
        
            }

         

        방을 생성하기 전에 CustomRoomProperties로 현재 상태를 저장해줍니다.

         

            public override void OnRoomListUpdate(List<RoomInfo> roomList)
            {
        
        
                GameObject roomPrefab;
        
                foreach (RoomInfo room in roomList)
                {
                    if (room.CustomProperties.TryGetValue("RoomState", out object stateObj))
                    {
                        string state = stateObj as string;
        
                        if (state != "Waiting")
                        {
                            // 상태가 Waiting이 아니면 방 삭제 처리
                            if (DIC.TryGetValue(room.Name, out roomPrefab))
                            {
                                Destroy(roomPrefab);
                                DIC.Remove(room.Name);
                            }
                            continue; // 다음 방 처리
                        }
                    }
                    else
                    {
                        if (DIC.TryGetValue(room.Name, out roomPrefab))
                        {
                            Destroy(roomPrefab);
                            DIC.Remove(room.Name);
                        }
                        continue;
                    }
        
                    if (room.RemovedFromList == true)
                    {
                        // ROOM 이 삭제가 된 경우
                        DIC.TryGetValue(room.Name, out roomPrefab);
                        Destroy(roomPrefab);
                        DIC.Remove(room.Name);
        
                    }
                    else
                    {
                        // ROOM의 정보가 변경이 된 경우
        
                        if (DIC.ContainsKey(room.Name) == false)
                        {
                            // ROOM이 처음 생성이 된 경우
                            GameObject roomObj = InstantiateRoom();
        
                            Debug.Log(roomObj.name);
                            roomObj.GetComponent<RoomButtonManager>().SetData(room.Name, room.PlayerCount, room.MaxPlayers);
                            DIC.Add(room.Name, roomObj);
                        }
                        else
                        {
                            DIC.TryGetValue((room.Name), out roomPrefab);
                            roomPrefab.GetComponent<RoomButtonManager>().SetData(room.Name, room.PlayerCount, room.MaxPlayers);
                        }
        
                    }
                }
            }

         

        그 다음으로는 방 상태를 확인해서 Waiting 상태인 경우만 표시 하도록 하였습니다.

         

        여기서 만약을 위해 해당 변수가 없을 경우 삭제를 하였습니다.

         

         

            public static void SetRoomState(string newState)
            {
                var currentRoom = PhotonNetwork.CurrentRoom;
                if (currentRoom == null) return;
                var roomstate = currentRoom.CustomProperties;
                if (roomstate.TryGetValue("RoomState", out object currentStateObj))
                {
                    if ((currentStateObj as string) == newState) return;
                    
                }
                currentRoom.SetCustomProperties(new PhotonHashTable {{ "RoomState", newState }});
            }

         

        현재 방 상태를 바꾸는 DataManager의 코드입니다.

         

        string으로 값을 받아서 해당 값으로 바꾸어 줍니다.

         

            IEnumerator DelayedLoadScene()
            {
                yield return new WaitForSeconds(0.2f); // 약간의 지연
                PhotonView sound = SoundManager.Instance.GetComponent<PhotonView>();
                sound.RPC("RPC_Play_BGM", RpcTarget.All, 1);
                SetRoomState("Playing");
                PhotonNetwork.LoadLevel("Game Scene");
            }

        마지막으로 게임 시작을 하면 현재 룸 상태를 Playing 상태로 바꾸어 줍니다.

         

        게임 시작 전
        결과

        게임을 시작하니 방 목록에서 사라지는 것을 확인 할 수 있습니다.

         

        'Unity > FPS Project' 카테고리의 다른 글

        [Photon] 스코어 보드  (1) 2025.06.15
        [Photon] 피해 및 사망 로직 변경  (0) 2025.06.13
        [Photon] 몬스터 체력 동기화 문제  (0) 2025.06.11
        [Photon] 몬스터 공격 수정  (0) 2025.06.10
        [Photon] 방 입장 및 레디 상태 추가  (0) 2025.06.07
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바