Why is photon instantiating double the players? (Unity3D)
Options
Hi Everyone,
I have a really quick question. The script is working except it instantiates the player twice and I cannot figure out why.
Here is the outline of the script:
1) Waits until enough players join
2) Once enough players have joined a countdown from 5 seconds starts
3) All players are joined into a new multiplayer scene
I can't figure out why double of every player are being instantiated.
Thanks!
Here is my script:
I have a really quick question. The script is working except it instantiates the player twice and I cannot figure out why.
Here is the outline of the script:
1) Waits until enough players join
2) Once enough players have joined a countdown from 5 seconds starts
3) All players are joined into a new multiplayer scene
I can't figure out why double of every player are being instantiated.
Thanks!
Here is my script:
using Photon.Pun; using Photon.Realtime; using System.Collections; using System.Collections.Generic; using UnityEngine.SceneManagement; using UnityEngine; using System.IO; public class PhotonRoom : MonoBehaviourPunCallbacks, IInRoomCallbacks { // Player settings private PhotonView PV; public Player [] players; public int playersInRoom; // Game settings private bool isGameLoaded = false; private bool doneLoading = false; private bool readyToStart = false; private int currentScene = 0; private int multiplayerScene = 1; // Count down private float countFrom = 6; void Awake () { DontDestroyOnLoad (this.gameObject); } private void Start () { PV = GetComponent<PhotonView> (); } public override void OnEnable () { base.OnEnable (); PhotonNetwork.AddCallbackTarget (this); SceneManager.sceneLoaded += OnSceneFinishedLoading; } public override void OnDisable () { base.OnDisable (); PhotonNetwork.AddCallbackTarget (this); SceneManager.sceneLoaded -= OnSceneFinishedLoading; } private void Update () { if (!isGameLoaded) { if (readyToStart) { Debug.Log ("Hit1"); countFrom -= Time.deltaTime; Debug.Log ("Time left: " + countFrom); } } if (countFrom <= 0) { if (doneLoading == false) { StartGame (); doneLoading = true; } } } public override void OnJoinedRoom () { base.OnJoinedRoom (); players = PhotonNetwork.PlayerList; playersInRoom = players.Length; if (playersInRoom % 2 == 0) { readyToStart = true; } if (playersInRoom == PhotonNetwork.CurrentRoom.MaxPlayers) { if (!PhotonNetwork.IsMasterClient) return; PhotonNetwork.CurrentRoom.IsOpen = false; } } public override void OnPlayerEnteredRoom (Player newPlayer) { base.OnPlayerEnteredRoom (newPlayer); players = PhotonNetwork.PlayerList; playersInRoom++; if (playersInRoom % 2 == 0) { readyToStart = true; } if (playersInRoom >= PhotonNetwork.CurrentRoom.MaxPlayers) { if (!PhotonNetwork.IsMasterClient) return; PhotonNetwork.CurrentRoom.IsOpen = false; } } void StartGame () { isGameLoaded = true; if (!PhotonNetwork.IsMasterClient) return; PhotonNetwork.CurrentRoom.IsOpen = false; PhotonNetwork.LoadLevel(multiplayerScene); } void OnSceneFinishedLoading (Scene scene, LoadSceneMode mode) { Debug.Log ("This was called"); currentScene = scene.buildIndex; if (currentScene == multiplayerScene) { isGameLoaded = true; PV.RPC ("RPC_LoadedGameScene", RpcTarget.MasterClient); } } [PunRPC] private void RPC_LoadedGameScene () { Debug.Log ("Players in Room: " + playersInRoom); Debug.Log ("PlayerList.Length: " + PhotonNetwork.PlayerList.Length); if (playersInRoom == PhotonNetwork.PlayerList.Length) { PV.RPC ("RPC_CreatePlayer", RpcTarget.All); } } [PunRPC] private void RPC_CreatePlayer () { PhotonNetwork.Instantiate (Path.Combine ("PhotonPrefabs", "PhotonNetworkPlayer"), transform.position, Quaternion.identity, 0); } }
0
Comments
-
Bump0
-
It seems your player creation is happening in an RPC. Generally you dont want to call PhotonNetwork.Instantiate in an RPC unless youre doing some ismine checks or something. From what i see each player that gets the RPC will spawn something. Try taking that out of your RPC loops and make it a local function call.2