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

时间:2013-03-26 10:30:26

标签: c# notifications unity3d

Component被添加到GameObject(甚至是儿童游戏对象)时,我是否会收到通知(可能通过某些方法/事件引发)?

我希望在编辑器中发生某些事件时收到通知(可能在某些编辑器脚本中),例如:

  • Component 已附加GameObject个实例
  • Component 已附加Prefab
  • GameObject已成为另一个GameObject孩子

这可能吗?如果是的话怎么样?


修改

我找到了一位代理人关注育儿问题:EditorApplication.hierarchyWindowChanged

相应的文件称为:

  

每当场景层次结构发生变化时调用。

     

这是transform.parent已更改,gameObject.name,正在创建一个新游戏   对象等。

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

2 个答案:

答案 0 :(得分:1)

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

#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或在构建时),或者如果您对此感到满意,则将其留在那里。在我的情况下,我的关卡编辑器是一个仅限编辑器的场景,它将编辑器场景的特定子集保存为游戏中使用的场景。

答案 1 :(得分:-1)

没有“内置”方式这样做很方便。但是,您可以通过几种方式模拟它。

  • 利用您的Component中的Awake()函数来调用它的父gameObjectSendMessage非常干净地工作)[注意:这仅在您添加新组件实例时有效]

OR

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

    这里只是 可以为情况工作的2个例子 - 还有更多。在一天结束时,没有任何东西(截至目前),但从一个解决方案的角度来看肯定是可行的。