6

Component当将 a添加到GameObject(甚至是子游戏对象)时,是否可以通知我(可能通过引发的某些方法/事件)?

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

  • AComponent附加GameObject实例
  • AComponent附加Prefab
  • AGameObject变成了另一个人的孩子GameObject

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


编辑

我找到了一个关心育儿问题的代表:EditorApplication.hierarchyWindowChanged

根据文档,它被称为:

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

这是transform.parent改变,gameObject.name,创建一个新的游戏对象等等。

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

4

2 回答 2

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如果可能的话,可能在构建时或构建时),或者如果您对此感到满意,就让它什么都不做。在我的例子中,我的关卡编辑器是一个仅限编辑器的场景,它会将编辑器场景的特定子集保存为游戏中使用的场景。

于 2017-02-22T18:16:03.230 回答
-1

没有“内置”的方式可以方便地做到这一点。但是,您可以通过几种方式对其进行模拟。

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

或者

  • 创建一个变量来跟踪它的父级。在该Update()方法中,检查当前父级以触发向新父级发送消息。

    这里只是 2 个适用于情况的示例——还有更多。归根结底,什么都没有(到目前为止),但从变通的角度来看肯定是可行的。

于 2013-03-26T20:46:04.223 回答