【问题标题】:NullReferenceException in Unity (C#)Unity 中的 NullReferenceException (C#)
【发布时间】:2013-10-28 13:03:50
【问题描述】:

我正在尝试将 Quest 对象添加到 Person。它对一个成功并为另一个给出了 nullreferenceexception,我在这里做错了什么? 附:播放器和请求者在 Unity 检查器中设置。

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;
     }
}

有什么建议为什么会出错?

【问题讨论】:

  • 不,那个问题只是关于 NullReferenceException,我有一个关于 C# 中的问题,特别是 Unity 中的问题。再加上这个问题已经在两年前得到回答......
  • NullReferenceException 的原因以及如何修复它们总是相同的,至少参考问题解释的原因足够好,应该清楚为什么会发生错误(这里是 requestor 或 thisPerson空)。
  • 如果您费心阅读下面选定的答案,您会知道 Unity 以某种随机顺序执行操作,当使用 Start() 方法而不是 Awake() 方法时,这可能会导致 NRE,它是不是因为您的“重复”中所述的任何原因。

标签: c# unity3d nullreferenceexception


【解决方案1】:

将变量初始化移至Awake(),请参阅documentation 了解以下内容(释义):

Awake 用于初始化任何变量或游戏状态之前 游戏开始......并使用 Start 来回传递任何信息。

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

其他可能的错误:

  1. 您没有显式实例化 requestor,我将假设这是在 Unity 的 Inspector 中完成的。
  2. 您没有包含可能返回 null 的“createQuest()”。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-10
      • 2018-12-20
      • 1970-01-01
      • 2023-02-04
      • 2016-07-20
      • 2014-07-21
      • 2023-03-20
      • 2016-10-12
      • 2013-04-16
      相关资源
      最近更新 更多