在 Unity 中隐藏和显示按钮 (C#)

问题描述 投票:0回答:3

我有一个按钮(在用户界面中),我有时想隐藏它(但稍后再次显示),这意味着它不应该再显示,而且我不应该能够单击它。我找到的唯一解决方案(实际上已成功隐藏按钮)是

SetActive()

但是在

Update()
中,当我执行
SetActive(false)
时(真/假由脚本中的变量
wave_happening
控制),
Update()
不再运行,所以我无法再次将其设置为true 。 当我在另一个脚本中执行
GameObject.Find("Start Button").SetActive(true)
时,它只会给我一个 NullReferenceException (对象引用未设置为对象的实例)。

这是我的

Update()
功能:

void Update() {
    wave_happening = enemy_spawner_script.wave_happening;
    Debug.Log(wave_happening);
    transform.gameObject.SetActive(wave_happening);
}

有解决方案来阻止这个问题,或者有其他方法来隐藏按钮吗?

我对 Unity 和 C# 还很陌生,所以了解不多。

c# unity-game-engine button
3个回答
2
投票

您可以尝试禁用按钮的渲染和功能组件:

GetComponent<Button>().enabled = false; // remove functionality

GetComponent<Image>().enabled = false; // remove rendering

现在,将其添加到您的更新功能中,再加上一些性能更改,这样您就不会仅在需要时启用/禁用每个帧:

private bool isShowing = true; // or whatever your default value is

void Update() {
    wave_happening = enemy_spawner_script.wave_happening;
    Debug.Log(wave_happening);
    
    if(wave_happening != isShowing) {
        show(wave_happening);
        isShowing = wave_happening;
    }
}

void show(bool isShow) {
    GetComponent<Button>().enabled = isShow; // remove functionality

    GetComponent<Image>().enabled = isShow; // remove rendering
}

1
投票

要做好这件事确实很难。出现了很多问题:

  • 按钮不可避免地会位于 H 或 V 布局组中,并且,作为基本的软件工程问题,您当然希望它能够工作,无论它是否位于布局组中,因为布局细节可能会被设计人员更改随着项目的进行。 因此,正如OP最初猜测的那样,简单地使用

    .SetActive

    是一个非常好的主意
  • 但是您会遇到按钮关闭的问题,因此

    Update
    未运行。一个简单的解决方案是将按钮放在包装中。也就是说,只是在 UI 中
    Panel
    。 将按钮管理器脚本放在包装器上而不是放在按钮本身上。

然后你在管理器脚本上就有了一个漂亮的属性,

public bool Showme
{
    etc...

然后你就可以走了...

void Update()
{
    Showme = enemy_spawner_script.wave_happening;
}

无法获得看起来更简单的代码。

  • 但是,如果您使用包装面板。确实,您必须非常擅长使用 UI(尤其是自动调整大小的东西)才能使其按照您想要的方式工作。 但是,不幸的是,这是构建 Unity 专业知识的一部分。 :/

  • 对性能的担忧……真的很荒谬。 Unity 的原始代码“检查布尔值”和您自己的“检查布尔值”没有区别。 然而,从风格上来说,在更新中轮询它是很糟糕的。 (请注意,在上面的“B”点中,如果您要使用极其丑陋的“反轮询”代码,请将其埋入该属性中。)

然后...

“技巧”解决方案

    Unity UI 中的一个提示是您可以在任何地方添加
  • CanvasGroup
    。你为什么要这样做?它允许您淡化整个事情,这通常是实现您想要的目标的快速解决方案。
因此..

public CanvasGroup fader;
然后..

void Update() { fader.alpha = enemy_spawner_script.wave_happening ? 1f : 0f; }
你就完成了!


0
投票
只需根据需要使用button.gameobject.setactive(true) 或 false

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.