ugui 可视化创建以及关联事件很方便, 动态创建可以利用创建好的 prefab 进行实例化, 只是在关联事件上有些复杂, 本文总结了几种给按钮绑定事件的关联方式.
1. 可视化创建及事件绑定
step 1 : 通过 hierarchy 面板创建 ui > button
.
step 2 : 创建一个脚本 testclick.cs, 定义了一个 click 的 public 方法.
step 3 : 选中 hierarchy 中的 button, add component
脚本 testclick.cs
step 4 : 在 button(script)
关联 testclick 脚本里的 click 方法.
step 5 : done.
testclick.cs
using system.collections; using system.collections.generic; using unityengine; public class testclick : monobehaviour { public void click(){ debug.log ("button clicked. testclick."); } }
2. 通过直接绑定脚本来绑定事件
step 1 : 通过 hierarchy 面板创建 ui > button
.
step 2 : 创建一个 clickhandler.cs 脚本, 定义了一个私有方法 onclick(), 并在 start() 方法里为 button 添加点击事件的监听,作为参数传入 onclick 方法.
step 3 : 将 clickhandler 绑定在 button 对象上.
step 4 : done.
clickhandler.cs
using system.collections; using system.collections.generic; using unityengine; using unityengine.ui; public class clickhandler : monobehaviour { void start () { button btn = this.getcomponent
3. 通过 eventtrigger 实现按钮点击事件
ugui 系统中 button 默认只提供了 onclick 的调用方法, 有时候我们还需要监听鼠标进入事件 (mousein) 和鼠标滑出事件 (mouseout). 就需要借助 ui 系统中的 eventtrigger 脚本来实现.
step 1 : 通过 hierarchy 面板创建 ui > button
.
step 2 : 创建一个 eventtriggerhandler.cs 脚本, 利用 unityengine.eventsystems.eventtrigger 添加监听事件.
step 3 : 绑定 eventtriggerhandler.cs 脚本到 button 上.
step 4 : done.
eventtriggerhandler.cs
using system.collections; using system.collections.generic; using unityengine; using unityengine.ui; using unityengine.eventsystems; // 需要 eventtrigger 脚本的支援 [requirecomponent(typeof(unityengine.eventsystems.eventtrigger))] public class eventtriggerhandler : monobehaviour { // use this for initialization void start () { button btn = this.getcomponent
4. 通过 monobehaviour 实现事件类接口来实现事件的监听
step 1 : 通过 hierarchy 面板创建 ui > button
.
step 2 : 创建一个 eventhandler.cs 脚本.
step 3 : 将脚本绑定在 button 对象上.
step 4 : done.
eventhandler.cs
using system.collections; using system.collections.generic; using unityengine; using unityengine.ui; using unityengine.eventsystems; public class eventhandler : monobehaviour, ipointerclickhandler, ipointerenterhandler, ipointerexithandler, ipointerdownhandler, idraghandler { public void onpointerclick(pointereventdata eventdata){ if(eventdata.pointerid == -1){ debug.log ("left mouse clicked."); } else if(eventdata.pointerid == -2){ debug.log ("right mouse clicked."); } } public void onpointerenter(pointereventdata eventdata){ debug.log ("pointer enter.."); public void onpointerexit(pointereventdata eventdata){ debug.log ("pointer exit.."); public void onpointerdown(pointereventdata eventdata){ debug.log ("pointer down.."); public void ondrag(pointereventdata eventdata){ debug.log ("dragged.."); }
ugui 如何判断 ui 元素被点击时是鼠标的哪个按键, 上面的代码中我们可以根据 eventdata.pointerid 来监听是鼠标左键还是右键. 但是每个 ui 元素都创建一个 monobehaviour 来监听各个事件显然不好, 下面是通过利用 delegate 和 event 来做一个通用类 uieventlistener 来处理事件 (观察者模式).
uieventlistener.cs
using system.collections; using system.collections.generic; using unityengine; using unityengine.ui; using unityengine.eventsystems; public class uieventlistener : monobehaviour, ipointerclickhandler, ipointerenterhandler, ipointerexithandler { // 定义事件代理 public delegate void uieventproxy(gameobject gb); // 鼠标点击事件 public event uieventproxy onclick; // 鼠标进入事件 public event uieventproxy onmouseenter; // 鼠标滑出事件 public event uieventproxy onmouseexit; public void onpointerclick(pointereventdata eventdata){ if (onclick != null) onclick (this.gameobject); } public void onpointerenter(pointereventdata eventdata){ if (onmouseenter != null) onmouseenter (this.gameobject); public void onpointerexit(pointereventdata eventdata){ if (onmouseexit != null) onmouseexit (this.gameobject); }
testevent.cs
using system.collections; using system.collections.generic; using unityengine; using unityengine.ui; public class testevent : monobehaviour { void start () { button btn = this.getcomponent
testevent 脚本绑定在 button 上即可.
project 结构
代码 :