为啥我不能禁用按钮?

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()方法中初始化button1button2也有问题。 我发布的代码在您按下鼠标时禁用了另一个按钮,当您释放它时,再次启用该按钮。这就是你想要的吗? 是的,我需要那个。 当你点击一个按钮时,你是如何发现另一个按钮被禁用的? 在检查器上分配相应的按钮,确保它,但它仍然不能正常工作。 【参考方案1】:

问题在于初始化boton1boton2

boton1 = GetComponent<Button>();
boton2 = GetComponent<Button>();

上面两行表示boton1boton2 相同,指的是附加到游戏对象的按钮。

无需在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 对象。

【讨论】:

以上是关于为啥我不能禁用按钮?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以禁用但不能启用可丢弃功能?

为啥我不能禁用 ARC(每个单个文件)?

为啥我不能在 Visual Studio 中禁用预编译头文件?

禁用443端口还能访问https吗?如果不能那为啥还要禁用

为啥当我打开对话框时它会禁用所有 qml 项目

为啥 Swift 3 不能识别我的按钮点击?