问题描述
我有一个附加到UI游戏对象的脚本,该脚本查找并获取对画布根游戏对象的引用。现在,我会每隔update()
刷新参考,以防游戏对象移动到层次结构的其他位置并且画布根已更改。
但是我发现我的脚本要保持GetComponentInParent<Canvas>().rootCanvas
每一个update()
的运行性能会很沉重,尤其是当对象位于具有1000多个游戏对象的层次结构的底部时。因此,我希望脚本仅在start()
以及对象层次结构更改时找到根画布。
我找到了https://docs.unity3d.com/ScriptReference/EditorApplication-hierarchyChanged.html,但它仅用于编辑器,构建后将不遵循。有什么办法可以做类似于OnHierarchyChanged()
的事情吗?还使用循环检查层次结构的当前状态不在选项之内。
解决方法
一些想法:
- 第一个
GetComponentInParent<Canvas>
很贵,但是 只需致电Transform.parent
?您只需要实例化 开头的父级参考,即使您选中Update
,价格便宜。 - 第二个,如果您知道(并且您应该知道)哪些事件 这会改变您的层次结构,您可以创建自己的委托, 事件,采取任何行动对其进行跟踪。
- 最后,我不确定这一点,但您检查了吗 Transform.hasChanged?我认为这最后一个不起作用,因为 只影响旋转,位置等...但是我不能保证正确 现在。
举例2(我认为其他2相当清楚):
using UnityEngine;
using System.Collections;
public class ClassThatCanChangeHierarchy : MonoBehaviour
{
private List<GameObject> objectsThatWantToKnow = new List<GameObject>();
private void MethodThatChangeHierarchy()
{
//your code that affects hierarchy...
foreach(GameObject go in objectsThatWantToKnow)
{
go.GetComponent<ClassThatWantsToKnowWhenHierarchyChanges>().OnHierarchyChange?.Invoke();
}
}
}
using UnityEngine;
using System;
public class ClassThatWantsToKnowWhenHierarchyChanges : MonoBehaviour
{
public Action OnHierarchyChange = null;
private void Awake()
{
OnHierarchyChange = () => Debug.log("hierarchy has changed");
}
}