Итак, я последовал руководству по добавлению многопользовательской игры в фотоны, но у меня возникла проблема. Сначала я выбираю две сцены, такие как StartMenu, где вы просто добавляете поле имени игрока и продолжаете, и следующая сцена MainMenu, где вы выбираете комнату, создаете комнату или присоединяетесь к случайной комнате. Для первого шага я попытался присоединиться к случайной комнате, но когда я нажимаю «Пуск», игра просто запускает панель «Ожидание», не входя ни в какую игру (я тоже создаю игру в Xcode и открываю там, чтобы было больше одного игрока). Не знаю, что добавить к инспектору в кнопке «Пуск», чтобы запустить весь процесс с НАЙТИ ОПОНЕНТНОЙ ПАНЕЛИ - ПИТАНИЕ ОЖИДАНИЯ - НАПРАВЛЕННУЮ НА КОМНАТУ. не знаю почему, потому что я использовал Text -TEXT ME SH PRO для «Ожидания». В учебнике, который я использовал, было только одно StartMenu, где он поместил поле ввода и просто кнопку продолжения и добавил все эти сценарии. (Я выбираю то же самое для моей текстовой кнопки в MainMenu, но она не работает для перенаправления в комнату)
![enter image description here](https://i.stack.imgur.com/uE4ji.png)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using Photon.Pun;
public class PlayerNameInput : MonoBehaviour
{
[SerializeField] private TMP_InputField nameInputField;
[SerializeField] private Button continueButton;
private const string PlayerPrefsNameKey = "PlayerName";
private void Start()
{
SetUpInputField();
}
private void SetUpInputField()
{
if(!PlayerPrefs.HasKey(PlayerPrefsNameKey)) { return; }
string defaultName = PlayerPrefs.GetString(PlayerPrefsNameKey);
nameInputField.text = defaultName;
SetPlayerName(defaultName);
}
public void SetPlayerName(string name)
{
continueButton.interactable = !string.IsNullOrEmpty(name);
}
public void SavePlayerName()
{
string playerName = nameInputField.text;
PhotonNetwork.NickName = playerName;
PlayerPrefs.SetString(PlayerPrefsNameKey, playerName);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using Photon.Pun;
using Photon.Realtime;
public class MainMenu : MonoBehaviourPunCallbacks
{
[SerializeField] private GameObject findOpponentPanel = null;
[SerializeField] private GameObject waitingStatusPanel = null;
[SerializeField] private TextMesh waitingStatusText = null;
private bool isConnecting = false;
private const string GameVersion = "0.1";
private const int MaxPlayersPerRoom = 3;
private void Awake()
{
PhotonNetwork.AutomaticallySyncScene = true;
}
public void FindOpponent()
{
isConnecting = true;
findOpponentPanel.SetActive(false);
waitingStatusPanel.SetActive(true);
waitingStatusText.text = "Searching...";
if (PhotonNetwork.IsConnected)
{
PhotonNetwork.JoinRandomRoom();
}
else
{
PhotonNetwork.GameVersion = GameVersion;
PhotonNetwork.ConnectUsingSettings();
}
}
public override void OnConnectedToMaster()
{
Debug.Log("Connected to Master");
if (isConnecting)
{
PhotonNetwork.JoinRandomRoom();
}
}
public override void OnDisconnected(DisconnectCause cause)
{
waitingStatusPanel.SetActive(false);
findOpponentPanel.SetActive(true);
Debug.Log($"Disconnected due to :{cause}");
}
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("No clients are waiting for an opponent ,create a new room");
PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = MaxPlayersPerRoom });
}
public override void OnJoinedRoom()
{
Debug.Log("Client successfully joined a room");
int PlayerCount = PhotonNetwork.CurrentRoom.PlayerCount;
if(PlayerCount != MaxPlayersPerRoom)
{
waitingStatusText.text = "Waiting for Opponent";
Debug.Log("Client is waiting for an opponent");
}
else
{
waitingStatusText.text = "Opponent Found";
Debug.Log("Matching is ready to begin");
}
}
public override void OnPlayerEnteredRoom(Player newPlayer)
{
if(PhotonNetwork.CurrentRoom.PlayerCount == MaxPlayersPerRoom)
{
PhotonNetwork.CurrentRoom.IsOpen = false;
waitingStatusText.text = "Opponent Found";
Debug.Log("Match is ready to begin");
PhotonNetwork.LoadLevel("RoomPlay");
}
}
}