Search code examples
c#unity-game-enginemultiplayerphoton

Using Photon in Unity after leaving room user can't connect to room by name


Users connect to lobby:

private void Start()
{
    PhotonNetwork.ConnectUsingSettings();
}

public override void OnConnectedToMaster()
{
    PhotonNetwork.JoinLobby();
    SceneManager.LoadScene("Lobby");
}

Then users create room or enter in a room by its name

private Dictionary<string, RoomInfo> _roomList = new Dictionary<string, RoomInfo>();

private bool CheckNullOrEmpty(string name)
{
    return !string.IsNullOrEmpty(name);
}

private bool CheckServerAvaliable(string qwe)
{
    bool isAvaliable = true;

    foreach (var item in _roomList)
    {
        RoomInfo info = item.Value;

        if (info.Name == qwe)
        {
            isAvaliable = false;
        }
    }

    return isAvaliable;
}

private void SetNickname()
{
    PhotonNetwork.NickName = _nickname.text;
    PlayerPrefs.SetString("name", _nickname.text);
}

private void CreateRoom()
{
    RoomOptions roomOptions = new() { MaxPlayers = _maximumPlayers };
    PhotonNetwork.CreateRoom(_createServer.text, roomOptions);
}

public void TryCreateRoom()
{
    if (CheckNullOrEmpty(_createServer.text) && CheckServerAvaliable(_createServer.text) && CheckNullOrEmpty(_nickname.text))
    {
        SetNickname();

        CreateRoom();
    }

    else if (!CheckNullOrEmpty(_nickname.text))
    {
        _errorText.SetText("Nickname cannot contain only spaces or be empty");
    }


    else if (!CheckServerAvaliable(_createServer.text))
    {
        _errorText.SetText("The name of the room is occupied");
    }
}

public void TryJoinRoom()
{
    if (!CheckServerAvaliable(_joinServer.text))
    {
        SetNickname();

        PhotonNetwork.JoinRoom(_joinServer.text);
    }

    else if (!CheckNullOrEmpty(_nickname.text))
    {
        _errorText.SetText("Nickname cannot contain only spaces or be empty");
    }

    else if (CheckServerAvaliable(_joinServer.text))
    {
        _errorText.SetText("There is no room with such name");
    }
}
private void UpdateCachedRoomList(List<RoomInfo> roomList)
{
    for (int i = 0; i < roomList.Count; i++)
    {
        RoomInfo info = roomList[i];
        if (info.RemovedFromList)
        {
            _roomList.Remove(info.Name);
        }
        else
        {
            _roomList[info.Name] = info;
        }
    }
}

public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
    UpdateCachedRoomList(roomList);
}

Everything works well, then users leave room and enter lobby:

  public void Leave()
{
    PhotonNetwork.LeaveRoom();
    SceneManager.LoadScene("Lobby");
}

In lobby creating room works fine, but entering to room doesn't work, i get - There is no room with such name. I commented verification of server existing, and then user connected, i don't understand what is the problem in verification


Solution

  • Solved the problem by simple adding

    public override void OnConnectedToMaster()
    {
        if (!PhotonNetwork.InLobby)
            PhotonNetwork.JoinLobby();
    }