unity ugui 按钮绑定事件的 4 种方式汇总-kb88凯时官网登录

来自:网络
时间:2023-01-01
阅读:
免费资源网 - https://freexyz.cn/

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 结构

代码 :

免费资源网 - https://freexyz.cn/
返回顶部
顶部
网站地图