首先,思路是这样,根据按钮的名称,获取到按钮的组件,然后再为按钮加上按钮事件 第一步,获取按钮的transform 可以放在你的工具类中
/// <summary> /// 查找节点对象 /// </summary> /// <param name="goParent">父对象的GameObject</param> /// <param name="childName">子对象</param> /// <returns></returns> public static Transform FindChildNode(GameObject goParent, string childName) { Transform searchTrans = null; searchTrans = goParent.transform.Find(childName); if (searchTrans == null) { //遍历父物体的所有子节点 foreach (Transform item in goParent.transform) { searchTrans = FindChildNode(item.gameObject, childName); if (searchTrans != null) { return searchTrans; } } } return searchTrans; }
这样使用递归算法获取你所需要查找的组件,然后在Getcomponent<Button>(),获取到button组件, 第二步,封装按钮事件,也就是重写按钮组件的3个方法
public class EventTriggerListener : EventTrigger { public delegate void MyEventHandler(GameObject go); public MyEventHandler onClick; public MyEventHandler onMouseEnter; public MyEventHandler onMouseExit; public static EventTriggerListener GetListener (GameObject go) { EventTriggerListener eventTriggerListener = go.GetComponent<EventTriggerListener>(); if (eventTriggerListener == null) { eventTriggerListener = go.AddComponent<EventTriggerListener>(); } return eventTriggerListener; } public override void OnPointerClick(PointerEventData eventData) { onClick?.Invoke(gameObject); } public override void OnPointerEnter(PointerEventData eventData) { onMouseEnter?.Invoke(gameObject); } public override void OnPointerExit(PointerEventData eventData) { onMouseExit?.Invoke(gameObject); } }
然后是按钮的事件,可以直接调用
public class btnEvent : MonoBehaviour { /// <summary> /// 注册按钮点击事件 /// </summary> /// <param name="buttonName">按钮名称</param> /// <param name="myEventHandler">点击的事件</param> public static void RigisterButtonClickEvent(GameObject buttonObj, EventTriggerListener.MyEventHandler myEventHandler) { if (buttonObj != null) { EventTriggerListener.GetListener(buttonObj).onClick = myEventHandler; } } /// <summary> /// 注册按钮悬停事件 /// </summary> /// <param name="buttonName"></param> /// <param name="myEventHandler"></param> public static void RigisterButtonEnterEvent(GameObject buttonObj, EventTriggerListener.MyEventHandler myEventHandler) { if (buttonObj !=null) { EventTriggerListener.GetListener(buttonObj).onMouseEnter = myEventHandler; } } /// <summary> /// 注册按钮离开事件 /// </summary> /// <param name="buttonName"></param> /// <param name="myEventHandler"></param> public static void RigisterButtonExitEvent(GameObject buttonObj, EventTriggerListener.MyEventHandler myEventHandler) { if (buttonObj != null) { EventTriggerListener.GetListener(buttonObj).onMouseExit = myEventHandler; } }
调用的优雅代码:
btnEvent.RigisterButtonClickEvent( Btnlogin.gameObject//按钮的名称, p => { Eventbtnlogin.Invoke();//按钮调用的方法 });
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句