使用 Find in Awake 缓存脚本引用,在 Start 中不起作用

Posted

技术标签:

【中文标题】使用 Find in Awake 缓存脚本引用,在 Start 中不起作用【英文标题】:Cache script reference with Find in Awake works, in Start doesn't 【发布时间】:2018-11-01 11:20:34 【问题描述】:

我需要在 Unity 中缓存对另一个脚本的引用。

我不明白为什么,在下面的代码中,缓存 Start() 中的引用不起作用(我得到 NullReferenceException),而缓存 Awake() 中的引用起作用。

我的理解是 Start() 在 Awake() 之后被调用。但是从我在 Start() 被调用时看到的对象 AnotherScript 还不存在,而当 Awake() 被调用时它退出。

我错过了什么?

void Start()

    anotherscript = GameObject.Find("AnotherScript").GetComponent<AnotherScript>(); // does not work
    MyMethod();


void Awake()

    anotherscript = GameObject.Find("AnotherScript").GetComponent<AnotherScript>(); // works


void MyMethod()

    anotherscript.SomeMethod();

阿达斯达

【问题讨论】:

名为“AnotherScript”的游戏对象可能已在某处的 OnEnable 方法中被销毁。 脚本顺序也可以发挥作用。 嗯,从我在 Unity API 中读到的内容,此方法调用仅返回“活动”游戏对象上的对象。不确定您在使用“AnotherScript”做什么,但您是否在启动时禁用它们? 我的代码中没有使用 OnEnable 方法 不,我没有创建在启动时禁用的对象“AnotherScript” 【参考方案1】:

显然AnotherScript gameObject 在您第一次寻找它时并不存在。或者它已关闭。或者只是它的AnotherScript 组件尚未附加到它。如果您动态创建它,它可能会发生。

尝试调查实际时间线:将一些Debug.Log("i am ready " + name, gameObject); 放入此脚本和AnotherScriptAwake()Start() 方法中。

您还可以在 编辑 > 项目设置 > 脚本执行顺序 中明确重新排序脚本的执行顺序 仅当您确定您的脚本在创建/设置的第三个脚本之前启动时才执行此操作AnotherScript 正在启动。

【讨论】:

谢谢,我已经按照您的建议进行了调查,发现在 Start() 中,我在另一个脚本变量初始化之前调用了 MyMethod()。我在问题中发布的代码按预期工作。

以上是关于使用 Find in Awake 缓存脚本引用,在 Start 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Unity脚本启动顺序调整方法

unity 中函数调用的顺序

Unity - 脚本的 Awake() 是不是在其他脚本的 Start() 之前运行?

脚本生命周期

Unity不同脚本或者多个脚本之间的执行顺序Awake, Start

Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序