Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Unity-NullReferenceException与集合和获取_Oop_Unity3d_Get_Set_Nullreferenceexception - Fatal编程技术网

Oop Unity-NullReferenceException与集合和获取

Oop Unity-NullReferenceException与集合和获取,oop,unity3d,get,set,nullreferenceexception,Oop,Unity3d,Get,Set,Nullreferenceexception,我创建了一个PlayerData对象来存储播放器在其他脚本中需要的所有变量。我遇到访问器返回布尔值的问题,我不知道为什么它会给我这个错误。它不会给我设置bool的错误,只会返回bool,我不明白为什么,因为对象是在主类中声明的。错误: NullReferenceException:对象引用未设置为 反对 主类 public class PersistentData : MonoBehaviour { public static PersistentData persistentData;

我创建了一个
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 ActionClass : MonoBehaviour {
  void LateUpdate()
  {
      if (PersistentData.playerData.IsSliding)
      {
          //CODE SHOULD EXECUTE BUT GIVES NULLREFERENCE ERROR
      }
  }
}

这里的问题是,场景中没有包含
PersistentData
类的对象

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

改进:

  • 您可以在PlayerData.cs中去掉
    isSliding
    ,并将getter和setter更改为:

    public bool IsSliding{get;set;}

  • 由于您正在为您的
    PersistentData
    类实现一个单例,因此我将从
    PlayerData
    中删除
    static
    关键字,并在
    ActionClass
    中执行以下操作:

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

快乐编码

@Draco18s的可能复制品在复制品中我不会着急。首先,您的链接与.NET相关,这是Unity,可能由于DontDestroyOnLoad而有所不同。检查问题发生的位置,不能是属性,更可能是playerData。我认为你有太多的静态案例和错误的命名(我的口味)。用实例替换persistentData,使其符合单例命名。然后使playerData非静态。最后,尝试PersistentData.Instance.playerData。让我们来看看我们要做什么。另外,基于IsSliding的实现,您可以将它简化为公共bool IsSliding{get;set;}@Everts Unity运行在.NET上(它可能是.NET 2.0,但仍然是.NET),重复的目标没有问题。唯一让Unity与众不同的是你如何获得你的对象引用,而不是当它们为空时该怎么做(或者如何诊断哪一个为空)。你是一个救命恩人!非常感谢。
if (PersistentData.persistentData.playerData.IsSliding)
{

}