Я не могу установить пользовательские свойства Unity PUN 2

Я делаю многопользовательскую игру, в которой у каждого есть золото или переменная бомба. Я хочу установить это с помощью настраиваемых свойств, но получаю ошибку нулевой ссылки:
NullReferenceException: Object reference not set to an instance of an object

Вот мой код PlayerController:

public class PlayerController : MonoBehaviourPunCallbacks
{
    public ExitGames.Client.Photon.Hashtable myCustomProperties = new ExitGames.Client.Photon.Hashtable();
    public Rigidbody rb;
    public Player player;
    public int playerID;
    public int[] goldArray = { 1, 2, 5, 10, 20, 30, 50, 75, 100 };

    private void Start()
    {
        SetCustomProps();
        Debug.Log(PhotonNetwork.LocalPlayer.CustomProperties);
    }
 
    /*private void OnTriggerEnter(Collider other)
    {
        
        if (Input.GetKeyDown("space"))
        {
            Debug.Log("space pressed!");
            Destroy(other.gameObject);
            //swapBomb(other);
        }
    }*/
    /*private void swapBomb(Collider other)
    {

    }*/

    public void SetCustomProps()
    {
        int gold = (int)PhotonNetwork.LocalPlayer.CustomProperties["Gold"];    //error
        gold = goldArray[Random.Range(0, goldArray.Length)] * 10;
        myCustomProperties.Add("Gold", gold);

        bool bomb = (bool)PhotonNetwork.LocalPlayer.CustomProperties["Bomb"];
        bomb = false;
        myCustomProperties.Add("Bomb", bomb);

        PhotonNetwork.LocalPlayer.SetCustomProperties(myCustomProperties);   //error
    }
}

person Batuhan Koroglu    schedule 18.08.2020    source источник
comment
возможно он ищет локального игрока в инспекторе. Где вы назначаете ViewID для игрока? Кроме того, как вы создаете экземпляр игрока?   -  person Cagri Karabulut    schedule 19.08.2020
comment
Я создаю проигрыватель с помощью этой строки: PhotonNetwork.Instantiate(Path.Combine("PhotonPrefabs", "PhotonPlayer"), Vector3.zero, Quaternion.identity); Кажется, я не назначал ViewID, куда мне его назначать?   -  person Batuhan Koroglu    schedule 21.08.2020


Ответы (1)


Спасибо, что выбрали Фотон!

Изначально у игрока нет свойств Золото и Бомба. Следовательно, NullReferenceException при попытке получить и применить их.

Но действительно ли вам нужно сначала получить старые или текущие значения? Похоже, вы все равно переопределяете их.

Поэтому я бы сначала проверил, существуют ли они, используя ContainsKey или TryGetValue.

Пример 1:

    public void SetCustomProps()
    {
        object temp;
        if (PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("Gold", out temp))
        { 
           int gold = (int)temp;

Пример 2:

        if (PhotonNetwork.LocalPlayer.CustomProperties.ContainsKey("Bomb"))
        { 
           bool bomb = (bool)PhotonNetwork.LocalPlayer.CustomProperties["Bomb"];

Боковые примечания:

  • рекомендуется использовать статические поля или константы для строк настраиваемых ключей свойств вместо жестко закодированных здесь и там. это поможет вам избежать проблем с несоответствием ключей, поскольку они чувствительны к регистру.
  • если поле myCustomProperties используется только внутри SetCustomProperties, возможно, имеет смысл использовать его как локальную переменную только там.
  • возможно, вам нужно установить начальные пользовательские свойства перед присоединением комнат в отдельном методе. таким образом, вы получаете начальные значения непосредственно при соединении.
person JohnTube    schedule 20.08.2020