在使用unity制作UI的过程中,基本都需要接触到按钮,然后按钮要起作用的话,那么就需要为按钮绑定响应方法。

为按钮绑定触发的方法,我知道的有两种方法,第一种:手动使用unityEditor 绑定,另一种就是使用代码动态绑定。

这里记录一下代码动态绑定的具体实现过程:

思路:首先通过按钮的节点、名字在代码中返回对应的按钮对象,然后在点击按钮的时候,就给一个统一的委托赋值,

然后用委托去调用对应的响应方法。

做法步骤:

  1. 新建一个类,用于声明委托,并且给每一个按钮附加上这个类。

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class EventTriggerListener : MonoBehaviour, IPointerClickHandler, IPointerDownHandler
{
//声明委托
public delegate void VoidDelegate(GameObject go);
public VoidDelegate onClick;
public VoidDelegate onDown;
static public EventTriggerListener Get(GameObject go)
{
EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
if (listener == null) listener = go.AddComponent<EventTriggerListener>();
return listener;
}
//实现IPointerClickHandler接口的方法,在这里调用委托。
public void OnPointerClick(PointerEventData eventData)
{
if (onClick != null) onClick(gameObject);
}
//实现IPointerDownHandler接口的方法,在这里调用委托。
public void OnPointerDown(PointerEventData eventData)
{
if (onDown != null) onDown(gameObject);
}

2. 再建一个类,这个类主要功能是以名字来查找对应按钮,并且将其绑定到委托上,代码如下:

using UnityEngine;
using System.Collections; public class BJL_UIBehaviour : MonoBehaviour
{ // Use this for initialization
private GameObject _rootNode = null; public GameObject RootUI
{
get
{
return _rootNode;
}
set
{
_rootNode = value;
}
} //根据传入name找到RootUI下的gameobject
public GameObject QueryUINodes(string name)
{
if (RootUI!=null)
{
var child = RootUI.gameObject.transform.FindChild(name);
if (child!=null)
{
return child.gameObject;
}
}
return null;
} //用传入的name属性去找物体,找到后将其赋值给node,并且返回一个bool值。
//说明赋值是否为空。
public bool BindProperty(string name, out GameObject node)
{
node = QueryUINodes(name);
return node !=null;
} //用传入的name属性去找到一个gameobject,同时将其绑定到go物体上,如果绑定
//成功,那么就获取go物体上的EventTriggerListener脚本,并且将传入的委托del
//赋值给委托 onClick public bool BindObjectClick(string name, EventTriggerListener.VoidDelegate del)
{
GameObject go = null;
//如果绑定成功
if (BindProperty(name,out go))
{
EventTriggerListener.Get(go).onClick = del;
return true;
}
return false;
}

3. 最后,需要做的就是编写具体按钮的点击响应方法,然后调用BJL_UIBehaviour 中的BindObjectClick(string name ,EventTriggerListener.VoidDelegate del)方法来动态绑定。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic; public enum ClipType
{
Clip100 = , }
public class BJL_BetClip : BJL_UIBehaviour
{
public static int ChouMaType ;
private ClipType _select_type = ClipType.ClipUnknow;
private GameObject _last_obj = null;
public ClipType SelectType
{
get
{
return _select_type;
}
} void Awake()
{
GameObject root = this.gameObject.transform.FindChild("DownUI/Chips").gameObject;
RootUI = root;
BindObjectClick("Chip100", onClip100Click); } void onClip100Click(GameObject go)
{
//按钮点击时响应的操作
}

到这里,大功告成啦!

Unity动态绑定按钮触发方法的更多相关文章

  1. Cocoa触发方法调用的几种方法

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 1.SEL触发 SEL就是selector的缩写,它表示Cocoa中的方法选择器,不明白?那请仔细了解Objecti ...

  2. 在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味

    在UNITY中按钮的高亮用POINT灯实现,效果别具一番风味

  3. UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr!

    UNITY调用安桌方法出现 JNI: Init'd AndroidJavaClass with null ptr! 原因是····· 得运行在一个真正的Android设备上! 得运行在一个真正的And ...

  4. JavaScript点击事件-一个按钮触发另一个按钮

    <input type="button" value="Click" id="C" onclick="Go();" ...

  5. EasyUI触发方法、触发事件、创建对象的格式??

    创建对象 $("选择器").组件名({ 属性名 : 值, 属性名 : 值 }); 触发方法 $("选择器").组件名("方法名",参数); ...

  6. vue调用兄弟组件的方法使用vueBus调用$emit、$on(只需触发方法即可,不需要考虑传值或参数的问题)

    触发方: vueBus.$emit('queryAll') 被触发方: created() { vueBus.$on('queryAll', () => { this.getList() // ...

  7. jquery chosen onchange 值改变时触发方法

    jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...

  8. jQuery实现长按按钮触发事件的方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. js点击按钮触发事件的方法

    <!DOCTYPE html> <html> <body> <h1>My First Web Page</h1> <input id= ...

随机推荐

  1. 19-关键字package和import

    1. package的使用1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符 ...

  2. Springboot+Mybatis+Clickhouse+jsp 搭建单体应用项目(三)(添加增删改查)

    一.添加增加接口 @ApiResponses(value = { @ApiResponse(code = 200, message = "接口返回成功状态"), @ApiRespo ...

  3. 标星7000+,这个 Python 艺术二维码生成器厉害了!

    微信二维码,相信大家也并不陌生,为了生成美观的二维码,许多用户都会利用一些二维码生成工具. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手 ...

  4. Tomcat Windows 开机自启

    在命令提示符中,进入 tomcat 的 bin 目录,执行命令,注册服务 service.bat install 在"服务"中,将 tomcat 服务设为自动

  5. Kubernetes 使用arthas进行调试

    环境 因为k8s中是最基本的jre,网上说缺少tools.jar,但是补充了以后还是不行,最后还是将整个jdk给移到容器中的. jre中执行: /home # /opt/jre/bin/java -j ...

  6. java多线程(三):多线程单例模式,双重检查,volatile关键字

    一.事先准备 首先准备一个运行用的代码: public class Singleton { public static void main(String[] args) { Thread[] thre ...

  7. SpringBoot2 整合Ehcache组件,轻量级缓存管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ehcache缓存简介 1.基础简介 EhCache是一个纯Java的进程内缓存框架,具有快速.上手简单等特点,是Hibernate中默认 ...

  8. Cenos系统防火墙开放指定端口

    1.查看已经开放的端口 firewall-cmd --list-ports 2.开启指定端口 firewall-cmd --zone=public --add-port=2181/tcp --perm ...

  9. tableau用户分类

    1.观察消费金额的分布 直接[消费金额]直方图趋势不明显的时候,可以考虑将金额对数化处理 这样看起来就近似个正态分布了 2.怎么看超市卖的最好的产品 更深层次的分析怎么做呢? 这个聚合字段在数据源不会 ...

  10. 获取客户端用户真实ip方法整理(jekyll迁移)

    layout: post title: 获取客户端用户真实ip方法整理 date: 2019-08-22 author: xiepl1997 tags: springboot 由请求获取客户端ip地址 ...