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

标签: c# unity3d button interaction


【解决方案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 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多