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

Comments

  • omard2000
    Options
    Bump
  • Gage_IAG
    Options
    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.
  • omard2000
    Options
    @Gage_IAG Thank you! :)