专栏首页Unity TechnologyUnity编程技术:封装游戏按钮事件(悬浮,点击,退出)

Unity编程技术:封装游戏按钮事件(悬浮,点击,退出)

西山白雪三城戍,南浦清江万里桥。

首先,思路是这样,根据按钮的名称,获取到按钮的组件,然后再为按钮加上按钮事件.

第一步

获取按钮的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;
        }
    }

调用的优雅代码:

//参数是按钮的gameobject
 btnEvent.RigisterButtonClickEvent( Btnlogin.gameObject, p => {
            Eventbtnlogin.Invoke();//按钮调用的方法
        });

值得一提的是:上面的调用方法要在代码Awake中就要写好.否则会有报空的错误.

…END…

本文分享自微信公众号 - 游戏程序员聚集地(Game_Programmer),作者:Jtro

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-01-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:封装游戏按钮事件(悬浮,进入,点击)

    首先,思路是这样,根据按钮的名称,获取到按钮的组件,然后再为按钮加上按钮事件 第一步,获取按钮的transform 可以放在你的工具类中

    LittleU
  • Jtro的技术分享:Unity读取excel表格文件生成asset配置表文件

    项目开源地址:https://github.com/641273917/unity_Excel-asset- 许多时候,我们需要通过excel表格来生成我们要...

    LittleU
  • unity技术分享:编辑器扩展之Inspector面板可视化调整

    有些时候我们需要将数值暴露在面板中,有时候,只需要用public声明变量就可以了,或者序列化,但是这2种方法很笨,而且范围有限,不如用编辑器扩展得方法,下面演示...

    LittleU
  • 使用angular4和asp.net core 2 web api做个练习项目(一)

    这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是wind...

    solenovex
  • Android OKHTTP的单例和再封装的实例

    之前在看okhttp源码的时候,发现square没有对okhttpclient进行单例,网上也没找到合适的解释,以下是自己的猜测

    砸漏
  • Android底部导航栏的动态替换方案

    1、通常来说,一般情况下,我们的app的BottomTab会有下面几种实现方式。

    砸漏
  • 这篇小二区的文章你也能轻松学会

    Identification of a blood-based 12-gene signature that predicts the severity of ...

    科研菌
  • 热点 | 贾跃亭旗下电动汽车初创FF遭前CFO起诉,被指条约违法

    据报道,法乐第未来(Faraday Future)前CFO Stefan Krause(克劳斯)创立的电动汽车初创企业 EVelozcity 日前向洛杉矶高等法...

    镁客网
  • 02-线性结构2 一元多项式的乘法与加法运算 (20分)

    输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

    AI那点小事
  • 在Spring data中使用r2dbc

    上篇文章我们讲到了怎么在Spring webFlux中使用r2dbc,今天我们看一下怎么使用spring-data-r2dbc这个Spring data对r2d...

    程序那些事

扫码关注云+社区

领取腾讯云代金券