如何通知组件或子GameObject已经添加到GameObject中

本文关键字:GameObject 添加 何通知 通知 组件 | 更新日期: 2023-09-27 18:05:49

Component被添加到GameObject(甚至是子GameObject)时,我是否可以被通知(可能通过一些方法/事件)?

我想被通知(可能在一些编辑器脚本),当一些事件发生在编辑器中,例如:

  • Component附加GameObject实例
  • Component附加Prefab
  • GameObject已成为另一个GameObject节点的子节点

这可能吗?如果是,怎么做?


编辑

我找到了一个关于育儿的委托:EditorApplication。hierarchyWindowChanged

根据文档,它被称为

场景层级改变时调用。

这是变换。parent changed, gameObject.name,创建新游戏对象,等。

我仍然不明白是否有一种方便的方法来了解层次结构中的哪个对象被更改了

如何通知组件或子GameObject已经添加到GameObject中

你可以在(仅限编辑器)关卡编辑场景中为对象添加组件:

#if UNITY_EDITOR
using UnityEditor;
using UnityEngine;
public class LevelEditorHelper : MonoBehaviour
{
    LevelEditorHelper()
    {
        EditorApplication.hierarchyWindowChanged -= MyHierarchyChangedCallback;
        EditorApplication.hierarchyWindowChanged += MyHierarchyChangedCallback;
    }
    private static void MyHierarchyChangedCallback()
    {
        Debug.Log("Hierarchy has changed");
    }
}
#endif

然后在回调中,你可以访问当前选择的对象(添加的对象将是活动选择):

GameObject activeObj = Selection.activeGameObject;
if(activeObj != null) {
    ...

现在你可以检查它的父对象,看看它是否匹配任何其他对象,并执行其他检查,以确保这实际上是你感兴趣的事件(记住,它将被调用为各种其他层次结构的变化也),然后你可以调用另一个函数做任何你想要的动作。

注:这将不能在游戏场景中工作,如果你直接用关卡编辑器脚本编辑游戏场景,那么你需要更仔细地放置#if UNITY_EDITOR,并考虑如何删除不必要的组件(可能是在Start或在可能的构建时),或者如果你对此感到满意,就把它留在那里什么也不做。在我的例子中,我的关卡编辑器是一个只有编辑器的场景,它保存了编辑器场景的一个特定子集作为游戏中使用的场景。

没有"内置"的方法来方便地做到这一点。但是,您可以用几种方法模拟它。

  • 使用Awake()函数在你的组件调用它的父gameObject (SendMessage工作非常干净)[注意:这只适用于如果你添加一个新的组件实例]

  • 创建一个变量来跟踪它的父变量。在Update()方法中,检查当前父节点以触发SendMessage到新父节点。

    这里只是可以在这种情况下工作的两个例子-还有很多。在一天结束时,没有构建(到目前为止),但从变通的角度来看,肯定是可行的。