Недавно я начал создавать мобильную игру и решил использовать многопользовательскую функцию. Я посмотрел учебные пособия по YouTube и получил основы, но по неизвестной причине игроки не могут видеть друг друга.
Что я хочу сделать:
- Подключение к серверу
- Вступите в лобби
- Вступите в комнату, если в ней нет места - создайте новую
- Как только в одной комнате будет 2 игрока, начните игру (минимум 2 игрока - это минимум). количество игроков и максимум)
Что я делаю:
- Я создаю проект и получаю файл .exe
- Я запускаю .exe файл для подключения к серверу и создания новой комнаты (я знаю, что в начале еще нет места)
- Я запускаю проект в Unity
- Я подключаюсь к серверу чтобы присоединиться к комнате, созданной в 2., но по какой-то причине я не вижу комнату, и я создаю новую
- В результате я получаю две отдельные комнаты, в каждой из которых только один игрок, вместо того, чтобы получить одна комната с двумя игроками
Что я сделал:
- У меня есть Последние два дня я потратил на чтение документации и форума, но безуспешно.
- Я обнаружил похожие проблемы и реализовал предложенные решения (например, добавив IsVisible = true или IsOpen = true при создании новой комнаты), но в моем если они не работают
- Я добавил много журналов отладки, но моих знаний об Unity и Photon недостаточно, чтобы полностью использовать их потенциал
Вот код, отвечающий за Inte rnet соединение:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.SceneManagement;
public class PhotonLobby : MonoBehaviourPunCallbacks
{
public static PhotonLobby lobby;
public GameObject battleButton;
public GameObject cancelButton;
private void Awake(){
// creates the singleton, lives within the main menu screen
lobby = this;
}
// Start is called before the first frame update
void Start()
{
// connects to master photon server
PhotonNetwork.ConnectUsingSettings();
}
public override void OnConnectedToMaster()
{
Debug.Log("Player has connected to the Photon master server");
Debug.Log("Number of players connected to the master: " + PhotonNetwork.CountOfPlayersOnMaster);
PhotonNetwork.JoinLobby();
Debug.Log("Joined lobby");
PhotonNetwork.AutomaticallySyncScene = true;
battleButton.SetActive(true);
}
public void OnBattleButtonClicked()
{
Debug.Log("Battle button was clicked");
battleButton.SetActive(false);
cancelButton.SetActive(true);
PhotonNetwork.JoinRandomRoom();
}
public override void OnJoinRandomFailed(short returnCode, string message)
{
Debug.Log("Tried to join a random game but failed. There must be no open games available");
CreateRoom();
}
void CreateRoom()
{
Debug.Log("Trying to create a new room");
int randomRoomName = Random.Range(0,10000);
RoomOptions roomOps = new RoomOptions() {IsVisible = true, IsOpen = true, MaxPlayers = (byte) MultiplayerSetting.multiplayerSetting.maxPlayers};
PhotonNetwork.CreateRoom("Room" + randomRoomName, roomOps);
Debug.Log("Created room " + randomRoomName);
}
public override void OnCreateRoomFailed(short returnCode, string message)
{
Debug.Log("Tried to create a new room but failed. There must already be a room with the same name");
CreateRoom();
}
public void OnCancelButtonClicked()
{
Debug.Log("Cancel button was clicked");
cancelButton.SetActive(false);
battleButton.SetActive(true);
PhotonNetwork.LeaveRoom();
SceneManager.LoadScene(1);
}
}
И код, отвечающий за присоединение / создание комнат:
using System.IO;
using System.Collections;
using Photon.Pun;
using Photon.Realtime;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class PhotonRoom : MonoBehaviourPunCallbacks, IInRoomCallbacks
{
// room info
public static PhotonRoom room;
private PhotonView PV;
public bool isGameLoaded;
public int currentScene;
// player info
Player[] photonPlayers;
public int playersInRoom;
public int myNumberInRoom;
public int playerInGame;
// delayed start
private bool readyToCount;
private bool readyToStart;
public float startingTime;
private float lessThanMaxPlayers;
private float atMaxPlayers;
private float timeToStart;
private void Awake()
{
// set up singleton
if(PhotonRoom.room == null)
{
PhotonRoom.room = this;
}
else
{
if(PhotonRoom.room != this)
{
Destroy(PhotonRoom.room.gameObject);
PhotonRoom.room = this;
}
}
DontDestroyOnLoad(this.gameObject);
}
public override void OnEnable()
{
// subscribe to functions
base.OnEnable();
PhotonNetwork.AddCallbackTarget(this);
SceneManager.sceneLoaded += OnSceneFinishedLoading;
}
public override void OnDisable()
{
base.OnDisable();
PhotonNetwork.RemoveCallbackTarget(this);
SceneManager.sceneLoaded -= OnSceneFinishedLoading;
}
// Start is called before the first frame update
void Start()
{
// set private variables
PV = GetComponent<PhotonView>();
readyToCount = false;
readyToStart = false;
lessThanMaxPlayers = startingTime;
atMaxPlayers = 6;
timeToStart = startingTime;
}
// Update is called once per frame
void Update()
{
// for delay start only, count down to start
if(MultiplayerSetting.multiplayerSetting.delayStart)
{
if(playersInRoom == 1)
{
RestartTimer();
}
if(!isGameLoaded)
{
if(readyToStart)
{
atMaxPlayers -= Time.deltaTime;
lessThanMaxPlayers = atMaxPlayers;
timeToStart = atMaxPlayers;
}
else if(readyToCount)
{
lessThanMaxPlayers -= Time.deltaTime;
timeToStart = lessThanMaxPlayers;
}
Debug.Log("Display time to start to the players " + timeToStart);
if(timeToStart<=0)
{
Debug.Log("We have started the game!");
StartGame();
}
}
}
}
public override void OnJoinedRoom()
{
// sets player data when we join the room
base.OnJoinedRoom();
Debug.Log("We are now in a room");
photonPlayers = PhotonNetwork.PlayerList;
playersInRoom = photonPlayers.Length;
myNumberInRoom = playersInRoom;
PhotonNetwork.NickName = myNumberInRoom.ToString();
// for delay start only
if(MultiplayerSetting.multiplayerSetting.delayStart)
{
Debug.Log("Displayer players in room out of max players possible (" + playersInRoom + ":" + MultiplayerSetting.multiplayerSetting.maxPlayers + ")");
if(playersInRoom > 1)
{
readyToCount = true;
}
if(playersInRoom == MultiplayerSetting.multiplayerSetting.maxPlayers)
{
readyToStart = true;
if(!PhotonNetwork.IsMasterClient)
return;
PhotonNetwork.CurrentRoom.IsOpen = false;
}
}
// for non delay start
else if (playersInRoom == 2)
{
Debug.Log("We have started the game!");
StartGame();
}
else {
Debug.Log("There's only 1 player");
}
}
public override void OnPlayerEnteredRoom(Player newPlayer)
{
base.OnPlayerEnteredRoom(newPlayer);
Debug.Log("A new player has joined the room");
photonPlayers = PhotonNetwork.PlayerList;
playersInRoom++;
if(MultiplayerSetting.multiplayerSetting.delayStart)
{
Debug.Log("Displayer players in room out of max players possible (" + playersInRoom + ":" + MultiplayerSetting.multiplayerSetting.maxPlayers + ")");
if(playersInRoom > 1)
{
readyToCount = true;
}
if(playersInRoom == MultiplayerSetting.multiplayerSetting.maxPlayers)
{
readyToStart = true;
if(!PhotonNetwork.IsMasterClient)
return;
PhotonNetwork.CurrentRoom.IsOpen = false;
}
}
}
void StartGame()
{
isGameLoaded = true;
if(!PhotonNetwork.IsMasterClient)
return;
if(MultiplayerSetting.multiplayerSetting.delayStart)
{
PhotonNetwork.CurrentRoom.IsOpen = false;
}
PhotonNetwork.LoadLevel(MultiplayerSetting.multiplayerSetting.multiplayerScene);
}
void RestartTimer()
{
lessThanMaxPlayers = startingTime;
timeToStart = startingTime;
atMaxPlayers = 6;
readyToCount = false;
readyToStart = false;
}
void OnSceneFinishedLoading(Scene scene, LoadSceneMode mode)
{
// called when multiplayer scene is loaded
currentScene = scene.buildIndex;
if(currentScene == MultiplayerSetting.multiplayerSetting.multiplayerScene)
{
isGameLoaded = true;
// for delay start game
if(MultiplayerSetting.multiplayerSetting.delayStart)
{
PV.RPC("RPC_LoadedGameScene", RpcTarget.MasterClient);
}
// for non delay start game
else
{
RPC_CreatePlayer();
}
}
}
[PunRPC]
public void RPC_LoadedGameScene()
{
playersInRoom++;
if(playerInGame == PhotonNetwork.PlayerList.Length)
{
PV.RPC("RPC_CreatePlayer", RpcTarget.All);
}
}
[PunRPC]
public void RPC_CreatePlayer()
{
PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "PhotonNetworkPlayer"),transform.position,Quaternion.identity, 0);
}
public override void OnPlayerLeftRoom(Player otherplayer)
{
base.OnPlayerLeftRoom(otherplayer);
Debug.Log(otherplayer.NickName+ "Has left the game");
playersInRoom--;
}
}
Заранее благодарю за любую помощь :)