Unity / Photon PUN玩家看不到彼此的房间并创建新的房间

问题描述 投票:0回答:2

最近,我已经开始创建手机游戏,并决定具有多人游戏功能。我观看了YouTube教程并获得了基础知识,但由于某些未知原因,玩家无法互相看到对方。

我想做什么:

  1. 连接到服务器
  2. 加入大厅
  3. 如果没有房间,请加入房间-创建一个新房间
  4. 一间房间中只有2位玩家开始游戏(2位玩家是最小玩家数,也就是最大玩家数)

我做什么:

  1. 我构建项目并获取.exe文件
  2. 我运行.exe文件以连接到服务器并创建一个新房间(我知道一开始还没有房间)
  3. 我在Unity中运行项目
  4. 我连接到服务器以加入在2中创建的会议室,但是由于某种原因,我看不到该会议室,因此我正在创建一个新会议室。>
  5. 结果,我得到两个单独的房间,每个房间只有一个玩家,而不是一个房间的两个玩家
  6. 我做了什么:

  • 我花了两天时间阅读文档和论坛,但没有成功。
  • [我发现了类似的问题,并实施了建议的解决方案(例如,每当我创建新房间时添加IsVisible = true或IsOpen = true,但在我的情况下它们却无法正常工作]]
  • 我添加了许多调试日志,但是我对Unity和Photon的了解不足以充分利用它们的潜力
  • 这里是负责互联网连接的代码:

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--;
}
}

谢谢您的帮助:)

最近,我已经开始创建手机游戏,并决定具有多人游戏功能。我观看了YouTube教程并获得了基础知识,但由于某些未知原因,玩家无法互相看到对方。什么...

unity3d multiplayer photon
2个回答
0
投票

如果连接到Photon Cloud,请确保客户端连接到相同的虚拟应用程序(AppId,AppVersion)和相同的服务器(区域)。如果使用默认的最佳区域连接方法,则需要考虑客户端最终可能会连接到两个不同的区域。浏览我们的“ Matchmaking Checklist”。


0
投票

我终于找到了解决方案,问题出在我的玩家所连接的区域。我已将区域设置为eu,并且它起作用了。我相信,每个玩家珍贵地连接到不同的地区。希望以后对您有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.