Unity3d 有引用时未设置对象引用

Unity3d 有引用时未设置对象引用,unity3d,Unity3d,编辑:我把“唤醒”改为“启动”,现在它开始工作了。有人可以吗 解释原因 我有一个简单的代码: public class UIManager : MonoBehaviour { public GameObject deathScreen; public void Awake() { GameEvents.instance.OnRestart += ShowDeathScreen; //line 10 } private void ShowDeat

编辑:我把“唤醒”改为“启动”,现在它开始工作了。有人可以吗 解释原因

我有一个简单的代码:

public class UIManager : MonoBehaviour
{
    public GameObject deathScreen;

    public void Awake() {
        GameEvents.instance.OnRestart += ShowDeathScreen; //line 10
    }

    private void ShowDeathScreen() {
        deathScreen.SetActive(true);
    }
}
我在编辑器中将一个对象分配给了死亡屏幕,为什么会出现这个错误? 抱歉,如果这是一个愚蠢的问题,我刚开始学习

全部错误:

NullReferenceException: Object reference not set to an instance of an object
UIManager.Awake () (at Assets/UIManager.cs:10)

bug finder解释过,所有类的start总是在唤醒后运行。您可以查看执行订单以了解更多信息

简言之,唤醒首先被调用(在所有活动的游戏对象上),然后开始,但是你不能依赖于唤醒/开始被调用的特定顺序(除非你开始混淆脚本执行顺序)。例如,如果您有UIManager、GameManager、PlayerController脚本,它们都使用Awake()进行初始化,那么它们可能会按照该顺序进行初始化,但可能不会。通常在编辑器中,场景层次用于顺序,但在设备/构建中,顺序可能不同


如果您需要按顺序进行初始化,我建议您使用一个脚本,在其他脚本上调用Initialize()函数。你可以设定你想要的顺序

当一个场景/游戏开始时,这些东西不会一下子出现,有点像你制作的,它们一个接一个地出现。这对游戏来说也是如此

执行令是真的

塞纳里奥:

ObjectA
  Awake()

ObjectB
  static variable1
  public variable2
  Awake()
所以,在ObjectA醒来时,它说,从ObjectB获取静态变量。。但是,objectB尚未成为下一个

将objectA更改为使用Start()将解决此问题,因为Start在第一帧之前运行,到那时,一切都已就绪

如果在层次结构中将objectB移到objectA之前,这可能也会有所帮助,但不一定可靠

另一种选择是手动设置项目脚本执行顺序中所需的顺序

简言之,处于唤醒状态的内容应该是自包含的,例如,仅与该对象相关的项目,例如,设置单例,初始化不依赖于其他内容的变量。简而言之,用人类的话来说,你可以在自己家里做任何事。开始,就是你要做的下一波依赖于其他东西的事情,比如依赖clasd数据的外部,你知道它已经走了那么远


当然,如果您有一个循环类型的依赖项,您仍然会遇到问题,就好像start in ObjectC需要来自ObjectD的数据,但D需要C来解决它

你真的确定UImanager没有在游戏事件分类之前启动吗?我将“唤醒”改为“启动”,它解决了这个问题,你能解释一下原因吗@是的。因为唤醒先运行,然后启动,显然游戏事件是在uimanager之后启动的,所以您可以按照继承顺序和unity执行顺序来更改它。。。