Я сталкиваюсь с этой проблемой, и это останавливает мой прогресс. Я делаю игру в шахматы с мультиплеером. Мне удалось создать комнату и заставить присоединиться другого игрока, но как только игра окончена, и один из игроков покидает игру, игрок, который уходит вторым, не может создать комнату или присоединиться к новой комнате для новой игры. и получает сообщение об ошибке «Ошибка 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();
}