在运行时检测层次结构更改

问题描述

我有一个附加到UI游戏对象的脚本,该脚本查找并获取对画布根游戏对象的引用。现在,我会每隔update()刷新参考,以防游戏对象移动到层次结构的其他位置并且画布根已更改。

但是我发现我的脚本要保持GetComponentInParent<Canvas>().rootCanvas每一个update()的运行性能会很沉重,尤其是当对象位于具有1000多个游戏对象的层次结构的底部时。因此,我希望脚本仅在start()以及对象层次结构更改时找到根画布。

我找到了https://docs.unity3d.com/ScriptReference/EditorApplication-hierarchyChanged.html,但它仅用于编辑器,构建后将不遵循。有什么办法可以做类似于OnHierarchyChanged()的事情吗?还使用循环检查层次结构的当前状态不在选项之内。

解决方法

一些想法:

  1. 第一个GetComponentInParent<Canvas>很贵,但是 只需致电Transform.parent?您只需要实例化 开头的父级参考,即使您选中 Update,价格便宜。
  2. 第二个,如果您知道(并且您应该知道)哪些事件 这会改变您的层次结构,您可以创建自己的委托, 事件,采取任何行动对其进行跟踪。
  3. 最后,我不确定这一点,但您检查了吗 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");
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...