我有一个按钮(在用户界面中),我有时想隐藏它(但稍后再次显示),这意味着它不应该再显示,而且我不应该能够单击它。我找到的唯一解决方案(实际上已成功隐藏按钮)是
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# 还很陌生,所以了解不多。
您可以尝试禁用按钮的渲染和功能组件:
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
}
要做好这件事确实很难。出现了很多问题:
按钮不可避免地会位于 H 或 V 布局组中,并且,作为基本的软件工程问题,您当然希望它能够工作,无论它是否位于布局组中,因为布局细节可能会被设计人员更改随着项目的进行。 因此,正如OP最初猜测的那样,简单地使用
.SetActive
是一个非常好的主意
但是您会遇到按钮关闭的问题,因此
Update
未运行。一个简单的解决方案是将按钮放在包装中。也就是说,只是在 UI 中Panel
。 将按钮管理器脚本放在包装器上而不是放在按钮本身上。
然后你在管理器脚本上就有了一个漂亮的属性,
public bool Showme
{
etc...
然后你就可以走了...
void Update()
{
Showme = enemy_spawner_script.wave_happening;
}
无法获得看起来更简单的代码。
但是,如果您使用包装面板。确实,您必须非常擅长使用 UI(尤其是自动调整大小的东西)才能使其按照您想要的方式工作。 但是,不幸的是,这是构建 Unity 专业知识的一部分。 :/
对性能的担忧……真的很荒谬。 Unity 的原始代码“检查布尔值”和您自己的“检查布尔值”没有区别。 然而,从风格上来说,在更新中轮询它是很糟糕的。 (请注意,在上面的“B”点中,如果您要使用极其丑陋的“反轮询”代码,请将其埋入该属性中。)
然后...
CanvasGroup
。你为什么要这样做?它允许您淡化整个事情,这通常是实现您想要的目标的快速解决方案。
public CanvasGroup fader;
然后..
void Update()
{
fader.alpha = enemy_spawner_script.wave_happening ? 1f : 0f;
}
你就完成了!