Home > Net >  Unity Photon 2 spawning players
Unity Photon 2 spawning players

Time:07-14

I am having hard time to spawning players for my game, I followed Blackthornprod tutorial for multiplayer but I can't spawn players just like he do, The errors I get every time I run it is "NullReferenceException: Object reference not set to an instance of an object PlayerSpawner.Start () (at Assets/PlayerSpawner.cs:18)" and if I move the arrow to change my avatars there's new error that I see and its "DefaultPool failed to load "Player". Make sure it's in a "Resources" folder. Or use a custom IPunPrefabPool. UnityEngine.Debug:LogError (object)" and "NullReferenceException: Object reference not set to an instance of an object PlayerSpawner.Start () (at Assets/PlayerSpawner.cs:20)" idk why so here's my code for spawning players in photon 2 unity

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class PlayerSpawner : MonoBehaviour
{
public GameObject[] playerPrefabs;
public Transform[] spawnPoints;
public PlayerItem _playerItem;

private void Start()
{
    int randomNumber = Random.Range(0, spawnPoints.Length);
    Debug.Log("1");
    Transform spawnPoint = spawnPoints[randomNumber];
    Debug.Log("2");
    GameObject playerToSpawn = playerPrefabs[(int)PhotonNetwork.LocalPlayer.CustomProperties["playerAvatar"]];
    Debug.Log("3");
    PhotonNetwork.Instantiate(playerToSpawn.name, spawnPoint.position, Quaternion.identity);
    Debug.Log("4");
}
}

and here's the other code for players that I want to spawn

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;

public class PlayerItem : MonoBehaviourPunCallbacks
{

public Text playerName;

public Color highlightColor;
public GameObject leftArrowButton;
public GameObject rightArrowButton;

ExitGames.Client.Photon.Hashtable playerProperties = new ExitGames.Client.Photon.Hashtable();
public Image playerAvatar;
public GameObject[] avatars;

Player player;

private void Start()
{
}

public void SetPlayerInfo(Player _player)
{
    playerName.text = _player.NickName;
    player = _player;
    UpdatePlayerItem(player);
}

public void ApplyLocalChanges()
{
    leftArrowButton.SetActive(true);
    rightArrowButton.SetActive(true);
}

public void OnClickLeftArrow()
{
    if ((int)playerProperties["playerAvatar"] == 0)
    {
        playerProperties["playerAvatar"] = avatars.Length - 1;
    }
    else
    {
        playerProperties["playerAvatar"] = (int)playerProperties["playerAvatar"] - 1;
    }
    PhotonNetwork.SetPlayerCustomProperties(playerProperties);
}

public void OnClickRightArrow()
{
    if ((int)playerProperties["playerAvatar"] == avatars.Length - 1)
    {
        playerProperties["playerAvatar"] = 0;
    }
    else
    {
        playerProperties["playerAvatar"] = (int)playerProperties["playerAvatar"]   1;
    }
    PhotonNetwork.SetPlayerCustomProperties(playerProperties);
}

public override void OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps)
{
    if (player == targetPlayer)
    {
        UpdatePlayerItem(targetPlayer);
    }
}

void UpdatePlayerItem(Player player)
{
    if (player.CustomProperties.ContainsKey("playerAvatar"))
    {
        playerAvatar.sprite = avatars[(int)player.CustomProperties["playerAvatar"]].GetComponent<SpriteRenderer>().sprite;
        playerProperties["playerAvatar"] = (int)player.CustomProperties["playerAvatar"];
    }
    else
    {
        playerProperties["playerAvatar"] = 0;
    }
}
}

also last thing if you ever need this but idk if this is needed or relevant but here's the code that will deliver my player to the next scene where I need it to spawn

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;

public class LobbyManager : MonoBehaviourPunCallbacks
{
public InputField roomInputField;
public GameObject lobbyPanel;
public GameObject roomPanel;
public Text roomName;

public RoomItem roomItemPrefab;
public List<RoomItem> roomItemList = new List<RoomItem>();
public Transform contentObject;

public float timeBetweenUpdates = 1.5f;
float nextUpdateTime;

public List<PlayerItem> playerItemsList = new List<PlayerItem>();
public PlayerItem playerItemPrefab;
public Transform playerItemParent;

public GameObject playButton;

private void Start()
{
    PhotonNetwork.JoinLobby();
}

public void OnClickCreate()
{
    if (roomInputField.text.Length >= 1)
    {
        PhotonNetwork.CreateRoom(roomInputField.text, new RoomOptions() { MaxPlayers = 10, BroadcastPropsChangeToAll = true });
    }
}

public override void OnJoinedRoom()
{
    lobbyPanel.SetActive(false);
    roomPanel.SetActive(true);
    roomName.text = "Room: "   PhotonNetwork.CurrentRoom.Name;
    UpdatePlayerList();
}

public override void OnRoomListUpdate(List<RoomInfo> roomList)
{
    if (Time.time >= nextUpdateTime)
    {
        UpdateRoomList(roomList);
        nextUpdateTime = Time.time   timeBetweenUpdates;
    }
}

void UpdateRoomList(List<RoomInfo> list)
{
    foreach (RoomItem item in roomItemList)
    {
        Destroy(item.gameObject);
    }
    roomItemList.Clear();

    foreach (RoomInfo room in list)
    {
        RoomItem newRoom = Instantiate(roomItemPrefab, contentObject);
        newRoom.SetRoomName(room.Name);
        roomItemList.Add(newRoom);
    }
}

public void JoinRoom(string roomName)
{
    PhotonNetwork.JoinRoom(roomName);
}

public void OnClickLeaveRoom()
{
    PhotonNetwork.LeaveRoom();
}

public override void OnLeftRoom()
{
    lobbyPanel.SetActive(true);
    roomPanel.SetActive(false);
}

public override void OnConnectedToMaster()
{
    PhotonNetwork.JoinLobby();
}

void UpdatePlayerList()
{
    foreach (PlayerItem item in playerItemsList)
    {
        Destroy(item.gameObject);
    }
    playerItemsList.Clear();

    if (PhotonNetwork.CurrentRoom == null)
    {
        return;
    }
    
    foreach (KeyValuePair<int, Player> player in PhotonNetwork.CurrentRoom.Players)
    {
        PlayerItem newPlayerItem = Instantiate(playerItemPrefab, playerItemParent);
        newPlayerItem.SetPlayerInfo(player.Value);

        if (player.Value == PhotonNetwork.LocalPlayer)
        {
            newPlayerItem.ApplyLocalChanges();
        }

        playerItemsList.Add(newPlayerItem);
    }
}

public override void OnPlayerEnteredRoom(Player newPlayer)
{
    UpdatePlayerList();
}

public override void OnPlayerLeftRoom(Player otherPlayer)
{
    UpdatePlayerList();
}

private void Update()
{
    if (PhotonNetwork.IsMasterClient && PhotonNetwork.CurrentRoom.PlayerCount >= 1)
    {
        playButton.SetActive(true);
    }
    else
    {
        playButton.SetActive(false);
    }
}

public void OnClickPlayButton()
{
    PhotonNetwork.LoadLevel("Game");
}
}

Thank you in advance if you ever decided to help me! I will put you in Credits of my game as payment, Thank youuuuu

CodePudding user response:

There are three problems.

  • Replace MonoBehviour with MonoBehviourPun.
  • Add all the prefabs contained in the "PlayerPrefabs" list into a folder called "Resources". All prefabs that PUN needs to instantiate must be in a folder with this name, or it will not be able to instantiate them. The prefabs to be instantiated must also have a PhotonView component.
  • There is no property called "PlayerAvatar". You can create one at the beginning of the game by assigning it a default value, such as 0. In the LobbyManager class, modify the start () method.

So it will work.

Good work!

  • Related