Unity中的NullReferenceException(C#)
我正在尝试向一个人添加一个任务对象。一个成功,另一个失败,我做错了什么? 另外,玩家和请求者在Unity inspector中设置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();
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
可能是第一个调用的对象,在这种情况下,您的其他脚本都没有初始化它们的值
其他可能的错误:
将变量初始化移动到
Awake()
,请参阅以了解以下内容(转述):
唤醒用于在启动之前初始化任何变量或游戏状态
游戏开始了。。。。并使用Start来回传递任何信息
您的GameCreator.Start()
的编写方式依赖于Unity调用脚本的任意顺序GameCreator
可能是第一个调用的对象,在这种情况下,您的其他脚本都没有初始化它们的值
其他可能的错误:
正如Jordak所说,启动方法可以按任何可能的顺序运行,所以不能依赖于另一个组件中某个组件的启动。有几种方法可以解决此问题:
- 您可以将基本初始化代码移动到Awake()。但是,这只允许您进行两个级别的初始化,将来可能不够
- 可以在项目设置中调整脚本优先级。然而,这并不是真正的C#方式,因为这使得代码依赖于从中看不出的逻辑
- 不要在类初始化中初始化thisPerson字段,而是创建一个公共属性来访问它。(无论如何,公共字段在C#中是不好的做法)。在该属性中,可以在返回字段之前检查字段是否为null,如果为null,则对其进行初始化
- 您可以将基本初始化代码移动到Awake()。但是,这只允许您进行两个级别的初始化,将来可能不够
- 可以在项目设置中调整脚本优先级。然而,这并不是真正的C#方式,因为这使得代码依赖于从中看不出的逻辑
- 不要在类初始化中初始化thisPerson字段,而是创建一个公共属性来访问它。(无论如何,公共字段在C#中是不好的做法)。在该属性中,可以在返回字段之前检查字段是否为null,如果为null,则对其进行初始化