Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.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
Unity中的NullReferenceException(C#)_C#_Unity3d_Nullreferenceexception - Fatal编程技术网

Unity中的NullReferenceException(C#)

Unity中的NullReferenceException(C#),c#,unity3d,nullreferenceexception,C#,Unity3d,Nullreferenceexception,我正在尝试向一个人添加一个任务对象。一个成功,另一个失败,我做错了什么? 另外,玩家和请求者在Unity inspector中设置 public class GameCreator : MonoBehaviour { private Quest quest; public Player player; public Requestor requestor; void Start() { quest = createQuest();

我正在尝试向一个人添加一个任务对象。一个成功,另一个失败,我做错了什么? 另外,玩家和请求者在Unity inspector中设置

public class GameCreator : MonoBehaviour {
     private Quest quest;
     public Player player;
     public Requestor requestor;

     void Start() {
         quest = createQuest();
         requestor.thisPerson.SetQuest(quest); //this is the problem
         player.thisPerson.SetQuest(quest);
     }
}

public class Player : MonoBehaviour {
     public Person thisPerson;

     void Start() {
           thisPerson = new Person("Name");
     }
}

public class Requestor: MonoBehaviour {
     public Person thisPerson;

     void Start() {
           thisPerson = new Person("Name");
     }
}

public class Person {
     public Quest quest;

     void SetQuest(Quest quest) {
           this.quest = quest;
     }
}

有什么建议可以解释为什么会出错吗?

将变量初始化移到
Awake()
,请参阅以下内容(转述):

唤醒用于在启动之前初始化任何变量或游戏状态 游戏开始了。。。。并使用Start来回传递任何信息

您的
GameCreator.Start()
的编写方式依赖于Unity调用脚本的任意顺序
GameCreator
可能是第一个调用的对象,在这种情况下,您的其他脚本都没有初始化它们的值

其他可能的错误:

  • 您没有显式地实例化请求者,我假设这是在Unity的Inspector中完成的
  • 您没有包含可能返回null的“createQuest()”

  • 将变量初始化移动到
    Awake()
    ,请参阅以了解以下内容(转述):

    唤醒用于在启动之前初始化任何变量或游戏状态 游戏开始了。。。。并使用Start来回传递任何信息

    您的
    GameCreator.Start()
    的编写方式依赖于Unity调用脚本的任意顺序
    GameCreator
    可能是第一个调用的对象,在这种情况下,您的其他脚本都没有初始化它们的值

    其他可能的错误:

  • 您没有显式地实例化请求者,我假设这是在Unity的Inspector中完成的
  • 您没有包含可能返回null的“createQuest()”

  • 正如Jordak所说,启动方法可以按任何可能的顺序运行,所以不能依赖于另一个组件中某个组件的启动。有几种方法可以解决此问题:

    • 您可以将基本初始化代码移动到Awake()。但是,这只允许您进行两个级别的初始化,将来可能不够
    • 可以在项目设置中调整脚本优先级。然而,这并不是真正的C#方式,因为这使得代码依赖于从中看不出的逻辑
    • 不要在类初始化中初始化thisPerson字段,而是创建一个公共属性来访问它。(无论如何,公共字段在C#中是不好的做法)。在该属性中,可以在返回字段之前检查字段是否为null,如果为null,则对其进行初始化

    正如Jordak所说,您的启动方法可以以任何可能的顺序运行,因此您不能依赖于另一个组件中某个组件的启动。有几种方法可以解决此问题:

    • 您可以将基本初始化代码移动到Awake()。但是,这只允许您进行两个级别的初始化,将来可能不够
    • 可以在项目设置中调整脚本优先级。然而,这并不是真正的C#方式,因为这使得代码依赖于从中看不出的逻辑
    • 不要在类初始化中初始化thisPerson字段,而是创建一个公共属性来访问它。(无论如何,公共字段在C#中是不好的做法)。在该属性中,可以在返回字段之前检查字段是否为null,如果为null,则对其进行初始化

    可能重复Nope,这个问题只是一个空引用异常,我有一个关于C#中的异常的问题,特别是在Unity中。另外,这个问题已经在两年多前得到了回答…NullReferenceException的原因以及如何修复它们总是一样的,至少参考问题充分解释了原因,应该清楚错误发生的原因(此处请求者或此人为null)。如果您费心阅读下面所选的anwser,您就会知道Unity会以某种随机顺序进行操作,当您使用Start()方法而不是Awake()方法时,这可能会导致NRE,这并不是因为您的“副本”中所述的任何原因。Nope的可能副本,该问题只是一个NullReferenceException,我有一个关于C#的问题,特别是在Unity中。另外,这个问题已经在两年多前得到了回答…NullReferenceException的原因以及如何修复它们总是一样的,至少参考问题充分解释了原因,应该清楚错误发生的原因(此处请求者或此人为null)。如果您费心阅读下面所选的anwser,您就会知道Unity以某种随机顺序进行操作,当您使用Start()方法而不是Awake()方法时,可能会导致NRE,这不是因为您的“副本”中所述的任何原因。