Reputation: 51
recently I have started creating a mobile game and decided to have a multiplayer feature. I watched youtube tutorials and got the basics but for some unknown reason players can't see each other.
What I want to do:
What I do:
What I did:
Here's the code responsible for Internet connection:
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);
}
}
And the code responsible for joining/creating rooms:
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--;
}
}
Thank you in advance for any help :)
Upvotes: 1
Views: 12426
Reputation: 51
I have finally found the solution, the problem were regions to which my players connected. I have set the region to eu and it worked. I believe that preciously each player connected to different region. I hope it will help someone in the future
Upvotes: 3
Reputation: 1812
If you connect to Photon Cloud, make sure clients are connected to the same virtual application (AppId, AppVersion) and to the same servers (Region). If you are using the default Best Region connection method, you need to consider that clients could end up connected to two different regions. Go through our "Matchmaking Checklist".
Upvotes: 3