Unity中的NullReferenceException(C#)

时间:2013-10-28 13:03:50

标签: c# unity3d nullreferenceexception

我正在尝试向Person添加Quest对象。它成功为一个并为另一个提供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;
     }
}

有什么建议可以解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

  

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

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

其他可能的错误:

  1. 您没有明确地实例化requestor,我将假设这是在Unity的Inspector中完成的。
  2. 您没有包含可能返回null的`createQuest()'。

答案 1 :(得分:1)

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

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