Unity-具有Sets和Gets的NullReferenceException

时间:2018-08-28 03:44:32

标签: oop unity3d get set nullreferenceexception

我创建了一个PlayerData对象,用于存储其他脚本中需要的播放器所有变量。我在访问器返回布尔值时遇到问题,我不知道为什么它会给我这个错误。它不会给我设置布尔值的错误,而只会返回它,而且我也看不出为什么,因为该对象是在主类中声明的。错误:

  

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 :(得分:0)

您的问题是您的场景中没有包含PersistentData类的对象。

创建一个空对象,然后将PersistentData.cs分配给它,然后重试。

改进:

  • 您可以在PlayerData.cs中摆脱isSliding并将其getter和setter更改为:

    public bool IsSliding { get; set; }

  • 由于您正在为PersistentData类实现单例,因此我将从static中删除PlayerData关键字,并在ActionClass中这样做:

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

编码愉快!