Игрок, который покидает второе место, не может создать комнату или присоединиться к ней - Unity Photon Network - PullRequest
0 голосов
/ 25 апреля 2020

Я сталкиваюсь с этой проблемой, и это останавливает мой прогресс. Я делаю игру в шахматы с мультиплеером. Мне удалось создать комнату и заставить присоединиться другого игрока, но как только игра окончена, и один из игроков покидает игру, игрок, который уходит вторым, не может создать комнату или присоединиться к новой комнате для новой игры. и получает сообщение об ошибке «Ошибка JoinRandomRoom. Клиент находится на GameServer (должен быть главным сервером для установления соответствия), но не готов к операциям (состояние: выход). Ожидание обратного вызова: OnJoinedLobby или OnConnectedToMaster». Не имеет значения, был ли игрок главным клиентом или нет, если они уходят вторыми? они не смогут присоединиться или создать новую комнату.

, как только игра закончится, и я переключаюсь в меню, я проверяю пару вещей в mainmenu, например: 1. Я все еще в номер? результат всегда ложен 2. Я даже подключен к серверу? результат всегда верен

Вот код, который работает в главном меню

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;


public class NetworkController : MonoBehaviourPunCallbacks
{
    private void Start()
    { 

        if(PhotonNetwork.InRoom)
        {
            Debug.Log("why am i In a room in start?");  
            PhotonNetwork.LeaveRoom();
        }
        if (PhotonNetwork.InLobby)
        {
            Debug.Log("why am i In a Lobby in start?");
            PhotonNetwork.LeaveLobby();
        }
        if (PhotonNetwork.IsConnected)
        {
            Debug.Log("We are connected to the " + PhotonNetwork.CloudRegion + " server! (Btw calling from start)");
        }
        else
        {
            Debug.Log("We are not connected to the " + PhotonNetwork.CloudRegion + " server! (Btw still calling from start)");
        }

        Connect();

    }


    private void Update()
    {
        if (!PhotonNetwork.IsConnected) 
        {
            Connect();
        }
    }

    public override void OnConnectedToMaster()
    {
        Debug.Log("We are connected to the " + PhotonNetwork.CloudRegion + " server!");
    }

    public override void OnLeftLobby()
    {
        Connect();
    }

    private void Connect()
    {
      //  PhotonNetwork.JoinLobby();
        PhotonNetwork.ConnectUsingSettings();

    }
}

Вот код, который работает после того, как пользователь нажмет кнопку главного меню

 public void OnHome()
    {
        if (PhotonNetwork.InRoom)
        {
            OnClickDisconnect();
            goHome = true;
        }
        else
        {
            SceneManager.LoadScene("Main Menu");
        }
    }

    public void OnQuit()
    {
        OnClickDisconnect();
        Application.Quit();
    }

 public void OnClickDisconnect()
    {
        PhotonNetwork.LeaveRoom(); 
    }

    public override void OnLeftRoom()
    {
        if(goHome == true)
        {
            goHome = false;
            SceneManager.LoadScene("Main Menu");
        }
    }

Можете ли вы помочь мне решить эту проблему? Я схожу с ума! Что бы я ни пытался, второй игрок просто не сможет присоединиться или создать новую комнату.

Редактировать 1: Код для присоединения к комнате, запрошенный @ JohnTube

Функция DelayStart ответственность за присоединение к лобби или создание комнаты в случае, если присоединение не удается. Он вызывается только тогда, когда игрок нажимает «Играть онлайн> Делает ставку> Начать игру (это называется»)

 public override void OnConnectedToMaster()
    {
        PhotonNetwork.AutomaticallySyncScene = true;
        delayStartButton.SetActive(true);
    }

    public void DelayStart()
    {
        int bet = MenuHandler.instance.betAmount;
        if (bet < 500)
            bet = 500;

        int currentMoney = MenuHandler.instance.currentMoney;
        if (currentMoney < bet)
        {
            MenuHandler.instance.popup_window.SetActive(true);
            return;
        }
        MenuHandler.instance.AddMoney(-bet);
        Hashtable expectedCustomRoomProperties = new Hashtable() { { "Bet", bet } };
        PhotonNetwork.JoinRandomRoom(expectedCustomRoomProperties, (byte)roomSize);

      //  PhotonNetwork.JoinRandomRoom();
    }

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        Debug.Log("Creating random room failed!!");
        CreateRoom();
    }

    private void CreateRoom()
    {
        Debug.Log("Creating Room Now");
        int randomRoomNumber = Random.Range(0, 10000);

        int bet = MenuHandler.instance.betAmount;
        if (bet < 500)
            bet = 500;

        RoomOptions roomOps = new RoomOptions() { IsVisible = true, IsOpen = true, MaxPlayers = (byte)roomSize, CustomRoomProperties = new ExitGames.Client.Photon.Hashtable() { { "Bet", bet } } };
        roomOps.CustomRoomPropertiesForLobby  = new string[] { "Bet", bet.ToString()};


        PhotonNetwork.CreateRoom("Room" + randomRoomNumber, roomOps);

    }

    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        Debug.Log(message);
       // CreateRoom();
    }

...