最近,我已经开始创建手机游戏,并决定具有多人游戏功能。我观看了YouTube教程并获得了基础知识,但由于某些未知原因,玩家无法互相看到对方。
我想做什么:
我做什么:
我做了什么:
这里是负责互联网连接的代码:
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教程并获得了基础知识,但由于某些未知原因,玩家无法互相看到对方。什么...
如果连接到Photon Cloud,请确保客户端连接到相同的虚拟应用程序(AppId,AppVersion)和相同的服务器(区域)。如果使用默认的最佳区域连接方法,则需要考虑客户端最终可能会连接到两个不同的区域。浏览我们的“ Matchmaking Checklist”。
我终于找到了解决方案,问题出在我的玩家所连接的区域。我已将区域设置为eu,并且它起作用了。我相信,每个玩家珍贵地连接到不同的地区。希望以后对您有所帮助