Unity-UGUI——通过代码给UI元素添加对应事件

来源:互联网 发布:深入理解大数据 编辑:程序博客网 时间:2024/05/17 06:06

一篇很基础但实用的笔记,希望能帮到新人顺便攒下点击率。


先从按钮说起

如何在脚本中给按钮指定单击事件

最初的时候,给按钮添加点击事件,我都是通过Button组件的面板进行的,

点一下加号,拖入一个脚本,然后指定是哪个public方法。

后来觉得这样太麻烦了,终于学会了在脚本里怎么写。

首先using UnityEngine.UI;

然后public Button btn1;这个btn_1就通过手动拖给脚本好了。

再然后在Start之类的方法里绑定处理方法

btn1.onClick.AddListener(Btn1ClickHandler);

BtnClickHandler就是一个正常的方法

/// <summary>    /// 无参数的按钮事件    /// </summary>    void Btn1ClickHandler() {        Debug.Log("按钮1被点击了");    }
这样就成功的给按钮1绑定了处理方法,点击之后会debug。


很遗憾这样写不能够传递参数,按钮的AddListener里只能跟一个没有参数的UnityAction。

但很多时候我们需要传递参数,比如说我们需要依据按钮的名字做一些对应处理。

那么,按钮的AddListener如何传递参数

这其实也贼简单
我们可以在addlistener里new 一个Unityaction,然后写个 lambda表达式
至于处理代码是直接在这里写完,还是将参数传递给一个有参数的方法,就随意了
btn2.onClick.AddListener(new UnityEngine.Events.UnityAction(() => { Btn2ClickHandle(btn2.name); }));
Btn2ClickHandle
/// <summary>    /// 有传参数的按钮事件    /// </summary>    /// <param name="name"></param>    void Btn2ClickHandle(string name) {        Debug.Log(name+"被点击了,顺便调用了按钮1的事件");        btn1.onClick.Invoke();    }
这里还写了一句btn1.onClick.Invoke();这句话可以模拟按钮1被单击。

这里提一下上面说的,按钮单击传按钮名作为参数,和模拟按钮被单击这两个东西可能会用在什么场景。
我能想到的中控(刚做这个的时候别人就告诉我这叫中控,其实我至今不知道中控是什么意思),就是那种一个pad一台pc(显示器可能是大屏幕),pad上按按钮,pc上响应的功能。
当pad上的按钮被按下,通过udp什么的将按钮名发送给pc,然后pc依据按钮名找到同名的按钮,执行绑定在按钮上的事件。这么一来,两边命令是一样的,而且可以分开了单独调试。
我只是顺便一提,可能大多数人都不需要做这种low逼项目,希望每个新人学有所成之后都能去做一些有意思的东西,而不是和现在的我一样。

记完了Button,记一下另一个比较常用的toggle。
toggle经常用在表单,还有一些其他的切换场景,比如,我在一组选项卡中选中某一个,画面上依据我选中的内容,给我显示一个对应的模型。
正常的toggle是独立的,一堆独立的toggle放在一起,你可以让他们全部被选中,也可以全部不被选中。
但如果将几个toggle设置为同一个togglegroup,那么这一组中,同时只能有一个被选中,就是所谓的“单选”。



在togglegroup对象上添加ToggleGroup组件


将底下的每一个toggle游戏对象的Toggle组件的togglegroup参数设置一下,拖过去就行


这么一来运行后就得到了一组能够单选的toggle,接下来我们绑定一下处理方法,跟按钮的不同之处在于它不在是onclick,并且addlistener里的unityaction需要传一个bool的参数,这个参数就是当前是否被选中

//Toggle    public Transform toggleGroup;    Toggle[] toggles;
上面是定义变量
下面绑定监听,当这一组toggle的值变化,就会debug被选中的那一个

toggles = toggleGroup.GetComponentsInChildren<Toggle>();        foreach (var t in toggles) {            t.onValueChanged.AddListener(new UnityEngine.Events.UnityAction<bool>((bool b) => {                if (b)                    Debug.Log(t.name);                    }));        }

想在代码中修改哪个哪个被选中,只要拿到它的toggle组件,然后设置isOn=true/false


最后记一个dropdown,就是这个下拉框


dropdown.onValueChanged.AddListener(new UnityEngine.Events.UnityAction<int>((int index)=> { Debug.Log(dropdown.options[index].text.ToString()); }));

这样就会在 切换之后打印出被选中项的文字



btn1.onClick.AddListener(Btn1ClickHandler);