Игроки Unity / Photon PUN не видят комнаты друг друга и создают новые - PullRequest
0 голосов
/ 25 января 2020

Недавно я начал создавать мобильную игру и решил использовать многопользовательскую функцию. Я посмотрел учебные пособия по YouTube и получил основы, но по неизвестной причине игроки не могут видеть друг друга.

Что я хочу сделать:

  1. Подключение к серверу
  2. Вступите в лобби
  3. Вступите в комнату, если в ней нет места - создайте новую
  4. Как только в одной комнате будет 2 игрока, начните игру (минимум 2 игрока - это минимум). количество игроков и максимум)

Что я делаю:

  1. Я создаю проект и получаю файл .exe
  2. Я запускаю .exe файл для подключения к серверу и создания новой комнаты (я знаю, что в начале еще нет места)
  3. Я запускаю проект в Unity
  4. Я подключаюсь к серверу чтобы присоединиться к комнате, созданной в 2., но по какой-то причине я не вижу комнату, и я создаю новую
  5. В результате я получаю две отдельные комнаты, в каждой из которых только один игрок, вместо того, чтобы получить одна комната с двумя игроками

Что я сделал:

  • У меня есть Последние два дня я потратил на чтение документации и форума, но безуспешно.
  • Я обнаружил похожие проблемы и реализовал предложенные решения (например, добавив 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--;
}
}

Заранее благодарю за любую помощь :)

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Я наконец нашел решение, проблема была в регионах, к которым подключались мои игроки. Я установил регион в ЕС, и это сработало. Я считаю, что драгоценно каждый игрок подключен к разным регионам. Я надеюсь, что это поможет кому-то в будущем

0 голосов
/ 27 января 2020

Если вы подключаетесь к Photon Cloud, убедитесь, что клиенты подключены к одному и тому же виртуальному приложению (AppId, AppVersion) и к тем же серверам (регион). Если вы используете метод соединения Best Region по умолчанию, вы должны учитывать, что клиенты могут подключаться к двум разным регионам. Go через наш " Контрольный список для организации матчей ".

...