【问题标题】:How to give information from a button?如何通过按钮提供信息?
【发布时间】:2016-09-05 01:46:25
【问题描述】:

我有四个按钮,例如:

我还有一个将我的脚本附加到它的游戏对象

在脚本下我有一个函数,当我在 onClick() 按钮中使用它时,它应该打印按钮的文本。

检查员

如何在不同的按钮上调用一个函数并打印出用户点击的那些按钮的文本?

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    与其将string 传递给回调函数,不如传递Button 实例本身更有意义。如果您这样做,您将能够在将来需要时从Button 访问更多数据。

    public Button[] Btn;
    
    void OnEnable()
    {
        //Register Button Events
        for (int i = 0; i < Btn.Length; i++)
        {
            int btIndex = i;
            Btn[i].onClick.AddListener(() => buttonCallBack(Btn[btIndex]));
        }
    }
    
    private void buttonCallBack(Button buttonPressed)
    {
        Debug.Log(buttonPressed.GetComponentInChildren<Text>().text);
    
        if (buttonPressed == Btn[0])
        {
            //Your code for button 1
        }
    
        if (buttonPressed == Btn[1])
        {
            //Your code for button 2
        }
    
        if (buttonPressed == Btn[2])
        {
            //Your code for button 3
        }
    
        if (buttonPressed == Btn[3])
        {
            //Your code for button 4
        }
    }
    
    void OnDisable()
    {
        //Un-Register Button Events
        for (int i = 0; i < Btn.Length; i++)
        {
            Btn[i].onClick.RemoveAllListeners();
        }
    }
    

    如果您仍想传递按钮文本:

    public Button[] Btn;
    
    void OnEnable()
    {
        //Register Button Events
        for (int i = 0; i < Btn.Length; i++)
        {
            int btIndex = i;
            string btText = Btn[btIndex].GetComponentInChildren<Text>().text;
            Btn[i].onClick.AddListener(() => buttonCallBack(btText));
        }
    }
    
    private void buttonCallBack(string buttonText)
    {
        Debug.Log(buttonText);
    }
    
    void OnDisable()
    {
        //Un-Register Button Events
        for (int i = 0; i < Btn.Length; i++)
        {
            Btn[i].onClick.RemoveAllListeners();
        }
    }
    

    记得将Buttons分配给编辑器中的Btn变量槽,否则会出现null异常错误。

    【讨论】:

    • 谢谢,但我有大约 300 个按钮,我认为这不是一个好方法。
    • 如果您有 300 个按钮并且只需要它们的 Text,请在我的回答中使用第二种解决方案。代码将始终相同,并且事件会自动注册和取消注册。顺便说一句,为什么你认为这样做不是一个好方法?
    • 对不起,我没有看到对我有用的第二种解决方案非常感谢:)
    • 如果您的问题得到解决,请不要忘记接受答案。编码愉快!
    • 是的,谢谢 :)
    【解决方案2】:

    而不是获取列表中的所有按钮。制作一个脚本 Button.cs 并给每个 UI 按钮

    在该脚本中创建一个公共方法

    public void OnButtonClickListener(int index) {
        // Do your code here for button click using its index
    }
    

    现在您只需将每个 UI 按钮的回调分配给这个公共方法并传递按钮索引的参数。

    希望对你有帮助……

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多