为啥我不能禁用按钮?
Posted
技术标签:
【中文标题】为啥我不能禁用按钮?【英文标题】:Why can't I disable a button?为什么我不能禁用按钮? 【发布时间】:2021-10-19 03:17:57 【问题描述】:我有问题。每次我尝试使用 Button.Interactable 制作一个不可交互的按钮时 但由于某种原因,我不明白它不起作用。我的代码很简单:
public Button boton1, boton2;
bool boton1Bool, boton2Bool;
void Start()
boton1 = GetComponent<Button>();
boton2 = GetComponent<Button>();
void Update()
if (boton1Bool == true)
Debug.Log("BOTON 1");
boton2.interactable = false;
else if (boton1Bool == false)
boton2.interactable = true;
if (boton2Bool == true)
Debug.Log("BOTON 2");
boton1.interactable = false;
else if (boton2Bool == false)
boton1.interactable = true;
public void Boton1Down()
boton1Bool = true;
public void Boton1Up()
boton1Bool = false;
public void Boton2Down()
boton2Bool = true;
public void Boton2Up()
boton2Bool = false;
这个小程序所做的是将 Button.Intaractable = false, 应用于按下另一个按钮。简单的。 我还留下了按钮的屏幕截图及其各自的脚本:
现在我有以下代码,但它仍然没有禁用我没有按下的按钮:
´´´
public Button boton1, boton2;
void Update()
public void Boton1Down()
boton2.GetComponent<Button>().interactable = false;
public void Boton1Up()
boton2.GetComponent<Button>().interactable = true;
public void Boton2Down()
boton1.GetComponent<Button>().interactable = false;
public void Boton2Up()
boton1.GetComponent<Button>().interactable = true;
´´´
【问题讨论】:
你能告诉我你为什么使用Update()
方法来启用/禁用按钮吗?您只需在ButtonDown()
和ButtonUp()
方法中启用和禁用它们。另外,在Start()
方法中初始化button1
和button2
也有问题。
我发布的代码在您按下鼠标时禁用了另一个按钮,当您释放它时,再次启用该按钮。这就是你想要的吗?
是的,我需要那个。
当你点击一个按钮时,你是如何发现另一个按钮被禁用的?
在检查器上分配相应的按钮,确保它,但它仍然不能正常工作。
【参考方案1】:
问题在于初始化boton1
和boton2
:
boton1 = GetComponent<Button>();
boton2 = GetComponent<Button>();
上面两行表示boton1
和boton2
相同,指的是附加到游戏对象的按钮。
无需在Start()
方法中初始化它们。因为您将它们公开并设置在 Inspector 面板中。所以,删除Start()
方法。
另外,无需在代码中使用Update()
方法和一些bool
变量。相反,删除 Update()
和 bool
变量并更改 BotonUp()
和 BotonDown()
方法:
public void Boton1Down()
boton2.interactable = false;
public void Boton1Up()
boton2.interactable = true;
public void Boton2Down()
boton1.interactable = false;
public void Boton2Up()
boton1.interactable = true;
【讨论】:
【参考方案2】:如上一个答案所述,您将值分配给 boton1 和 boton2 的方式会导致失败。
您需要在 Inspector 中分配它们。由于您将这些变量设为public,因此它们将有一个要分配的字段。
顺便说一句,我会给你一个更完整的解决方案:
将您的代码分为两个部分: 分配给具有 Button 组件的游戏对象 其他替代您在此处共享的按钮控制器第一个组件将如下所示:
// Attach this to the game objects with the button component
public ButtonHandler : MonoBehaviour, IPointerUpHandler
public UnityEvent onStopClick = new UnityEvent();
public UnityEvent onClick = new UnityEvent();
private void Start()
var btn = GetComponent<Button>();
btn.onClick.AddListener(onClick.Invoke);
public void OnPointerUp(PointerEventData eventData)
onStopClick.Invoke();
这样,当您单击按钮和释放按钮时,您将获得信息。
要替换你的控制器,你可以使用这个:
// Assign this on Unity Editor
public ButtonHandler boton1, boton2;
void Start()
boton1.onClick.AddListener(Boton1Down);
boton1.onStopClick.AddListener(Boton1Up);
boton2.ocClick.AddListener(Boton2Down);
boton2.onStopClick.AddListener(Boton2Up);
public void Boton1Down()
boton2.interactable = false;
public void Boton1Up()
boton2.interactable = true;
public void Boton2Down()
boton1.interactable = false;
public void Boton2Up()
boton1.interactable = true;
记住:使用 Editor 中的 Inspector 选项卡分配 ButtonHandler 对象。
【讨论】:
以上是关于为啥我不能禁用按钮?的主要内容,如果未能解决你的问题,请参考以下文章