Unity/FPS Project

[Photon] 방 상태 추가

SiJun-Park 2025. 6. 19. 04: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 상태로 바꾸어 줍니다.

 

게임 시작 전
결과

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