【问题标题】: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() 函数调用它的父组件gameObject(SendMessage 非常干净地工作)[注意:这仅在您添加新组件实例时才有效]
或