首页 > 解决方案 > 启用不同对象时是否可以运行 OnEnable() ?

问题描述

我想知道如果启用子对象而不是包含脚本的对象,是否可以使 onEnable() 函数工作。在这种情况下,我在父对象中创建了一个带有主脚本的菜单,以及一些用于检测与主对象交互的子对象上的 onEnable() 的脚本,所以我想通过仅使用脚本来简化在父对象中。这是一个选项还是我必须坚持为此使用多个脚本?

这将是辅助脚本之一 (MenuOpenUpdate)。在两个空隙中改变其值的布尔值将与主脚本交互。

void Start(){
public static bool MenuOpenUpdater;
}

private void OnDisable()
{
    MenuOpenUpdater = false;
}

private void OnEnable()
{
    MenuOpenUpdater = true;
}

这将是主脚本 (GameMenu),我希望拥有 onEnable() 和 onDisable() 但它与包含辅助脚本的对象一起执行,所以我只能使用这个。

void Start(){
    private bool MenuOpen;
}

void Update()
{
    MenuOpen = MenuOpenUpdate.MenuOpenUpdater;
}

}

如您所见,辅助脚本会根据它是活动的还是禁用的来更改布尔值,然后将该值发送到主脚本。我期望的结果是通过检测何时从父对象脚本启用或禁用子对象,从而在单个脚本上实现这一点。

我不知道这是否可行,只是让它变得更简单,如果做不到,我可以坚持为此使用多个脚本,任何帮助将不胜感激。

标签: c#unity3d

解决方案


  1. 如果您只想查询对象是否处于活动状态,则可以使用ActiveInHierarchy属性并在主脚本中检查它。

  2. 您可以创建一个可以添加到所有子元素的自定义组件。这将包括您的内部脚本和您需要的任何自定义行为,但您可以将其命名为 ObjectEnabler 或其他任何名称,并将其附加到您的所有元素。然后在您的主脚本中,您可以引用引用对象的变量。

  3. 一种事件驱动的方法是修改内部脚本以具有您可以订阅的事件:

内部对象:

public EventHandler event ObjectEnabled;
void OnEnabled()
{
    ObjectEnabled?.Invoke(this, new EventArgs());
}

以及订阅它的外部:

InnerObjectReference.ObjectEnabled += InnerObjectEnabledHandler;

public void InnerObjectEnabledHandler(object sender, EventArgs e) {
    ...
}

推荐阅读