Unity - NullReferenceException с наборами и получает - PullRequest
0 голосов
/ 28 августа 2018

Я создал объект PlayerData для хранения всех переменных для плеера, которые мне понадобятся в других скриптах. У меня проблема с аксессором, возвращающим значение bool, и я не знаю, почему он дает мне эту ошибку. Это не даст мне ошибок при установке bool, а только вернет его, и я не понимаю, почему объект был объявлен в основном классе. Ошибка:

NullReferenceException: ссылка на объект не установлена ​​на экземпляр объект.

ГЛАВНЫЙ КЛАСС

public class PersistentData : MonoBehaviour {
  public static PersistentData persistentData;
  public static PlayerData playerData;

  void Awake ()
  {
      if (persistentData == null)
      {
          DontDestroyOnLoad(gameObject);
          persistentData = this;
          playerData = gameObject.AddComponent<PlayerData>();
      } 
      else if (persistentData != this)
      {
          Destroy (gameObject);
      }
  }
}

КЛАСС ДАННЫХ ИГРОКА

public class PlayerData : MonoBehaviour {
  private bool isSliding;

  public bool IsSliding
  {
      get
      {
          return isSliding;
      }
      set
      {
          if (value == true || value == false)
          {
              isSliding = value;
          }
          else
          {
              isSliding = false;
          }
      }
  }
}

КЛАСС, КОТОРЫЙ ВЫЗЫВАЕТ ОБЪЕКТ

public class ActionClass : MonoBehaviour {
  void LateUpdate()
  {
      if (PersistentData.playerData.IsSliding)
      {
          //CODE SHOULD EXECUTE BUT GIVES NULLREFERENCE ERROR
      }
  }
}

1 Ответ

0 голосов
/ 28 августа 2018

Ваша проблема здесь в том, что у вас не было объекта в вашей сцене, который содержит PersistentData класс.

Создайте пустой объект, назначьте ему файл PersistentData.cs и повторите попытку.

Улучшения:

  • Вы можете избавиться от isSliding в PlayerData.cs и изменить геттер и сеттер на это:

    public bool IsSliding { get; set; }

  • Поскольку вы реализуете синглтон для своего класса PersistentData, я бы удалил ключевое слово static из PlayerData, а в ActionClass я бы сделал:

    if (PersistentData.persistentData.playerData.IsSliding)
    {
    
    }
    

Удачного кодирования!

...