使用 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);
放入此脚本和AnotherScript
的Awake()
和Start()
方法中。
您还可以在 编辑 > 项目设置 > 脚本执行顺序 中明确重新排序脚本的执行顺序 仅当您确定您的脚本在创建/设置的第三个脚本之前启动时才执行此操作AnotherScript
正在启动。
【讨论】:
谢谢,我已经按照您的建议进行了调查,发现在 Start() 中,我在另一个脚本变量初始化之前调用了 MyMethod()。我在问题中发布的代码按预期工作。以上是关于使用 Find in Awake 缓存脚本引用,在 Start 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Unity - 脚本的 Awake() 是不是在其他脚本的 Start() 之前运行?
Unity不同脚本或者多个脚本之间的执行顺序Awake, Start
Unity脚本的生命周期 同一脚本/不同脚本/游戏对象激没激活/脚本激没激活,几种情况下的Awake,OnEnable,Start的执行顺序