【问题标题】:How to be notified o a Component or child GameObject has been added to a GameObject如何通知组件或子游戏对象已添加到游戏对象
【发布时间】:2017-02-23 02:16:03
【问题描述】:

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

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

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

这可能吗?如果可以怎么办?


编辑

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

据文档称:

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

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

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

【问题讨论】:

    标签: c# notifications unity3d


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

    【讨论】:

      【解决方案2】:

      没有“内置”方式可以方便地执行此操作。但是,您可以通过多种方式对其进行模拟。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-06
        相关资源
        最近更新 更多