Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启用不同对象时是否可以运行OnEnable()?_C#_Unity3d - Fatal编程技术网

C# 启用不同对象时是否可以运行OnEnable()?

C# 启用不同对象时是否可以运行OnEnable()?,c#,unity3d,C#,Unity3d,我想知道如果启用了子对象而不是包含脚本的对象,是否可以使onEnable()函数工作。在本例中,我在父对象中创建了一个带有主脚本的菜单,以及一些用于在与主对象交互的子对象上检测onEnable()的脚本,因此我希望通过仅在父对象中使用脚本来简化此操作。这是一个选项还是我必须坚持使用多个脚本 这将是一个辅助脚本(MenuOpenUpdate)。在两个空白处更改其值的bool将与主脚本交互 void Start(){ public static bool MenuOpenUpdater; } pr

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

这将是一个辅助脚本(MenuOpenUpdate)。在两个空白处更改其值的bool将与主脚本交互

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;
}
}

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

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

  • 如果只想查询对象是否处于活动状态,可以使用该属性并在主脚本中检查该属性

  • void Start(){
    public static bool MenuOpenUpdater;
    }
    
    private void OnDisable()
    {
        MenuOpenUpdater = false;
    }
    
    private void OnEnable()
    {
        MenuOpenUpdater = true;
    }
    
  • 可以创建一个自定义构件,可以将其添加到所有子图元中。这将包括您的内部脚本和您需要的任何自定义行为,但您可以将其命名为ObjectEnabler或其他名称,并将其附加到所有元素。然后在主脚本中,可以引用引用对象的变量

  • 事件驱动的方法是修改内部脚本,使其具有可订阅的事件:

  • 内部对象:

    public EventHandler event ObjectEnabled;
    void OnEnabled()
    {
        ObjectEnabled?.Invoke(this, new EventArgs());
    }
    
    并由外部用户订阅:

    InnerObjectReference.ObjectEnabled += InnerObjectEnabledHandler;
    
    public void InnerObjectEnabledHandler(object sender, EventArgs e) {
        ...
    }
    

    解决方案是使用gameObject.activeInHierarchy来了解对象是否处于活动状态。非常感谢你的回答,这个解释对我帮助很大。