【问题标题】:detect hierarchy change during runtime在运行时检测层次结构变化
【发布时间】:2020-08-19 16:31:21
【问题描述】:

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

但是我发现我的脚本在每个 update() 中都运行 GetComponentInParent<Canvas>().rootCanvas 时性能很重,尤其是当对象位于具有 1000 多个游戏对象的层次结构的底部时。所以我希望我的脚本只在 start() 和对象层次结构发生变化时找到根画布。

我找到了https://docs.unity3d.com/ScriptReference/EditorApplication-hierarchyChanged.html,但它只是编辑器,构建后不会跟随。有什么办法可以做类似于 OnHierarchyChanged() 的事情吗?也不能使用循环检查层次结构的当前状态。

【问题讨论】:

    标签: unity3d hierarchy


    【解决方案1】:

    一些想法:

    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");
        }
    }
    

    【讨论】:

    • 要使用 rootcanvas ,它必须引用附加到游戏对象的画布,并且不能使用 Transform.parent ,因为如果第一个父级没有画布组件,我就不能使用 Canvas .rootcanvas。第三个想法我不知道,因为我的对象是画布的子对象,它的变换值由画布驱动,这会导致每次呈现 gui 时都会出现 Transform.hasChanged,这几乎与 update() 一样频繁。以及您的第二个想法,如果我从脚本更改层次结构,我可以跟踪它,但是如果统一本身改变层次结构怎么办?有什么解决办法吗?
    • 但感谢您至少尝试帮助我,我对此表示赞同。
    • 感谢您的支持。第一个选项(Transform.parent one)不限于 Canvas.rootcanvas。您需要对父 GameObject 的引用,如果它不是 Canvas 也没关系。请解释Unity本身在哪种情况下改变层次结构,所以我可以想一个解决方案^^
    • 那么如果第一个父级保持不变但它上面的层次结构发生了变化,我将如何检测层次结构的变化?
    • 因为它是递归的,你父母的父母也有一个参考。我知道,这不是最好的解决方案,但它的世界,好的解决方案应该是第二种解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多