专栏首页Unity TechnologyJtro的技术分享:封装游戏按钮事件(悬浮,进入,点击)

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

首先,思路是这样,根据按钮的名称,获取到按钮的组件,然后再为按钮加上按钮事件 第一步,获取按钮的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();//按钮调用的方法
        });

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    这样使用递归算法获取你所需要查找的组件,然后在Getcomponent<Button>(),获取到button组件,

    LittleU
  • Jtro的技术分享:unity中使用事件与委托加单例

    在unity开发中,如果你频繁的使用bool值判断,代码臃肿繁琐,请立即停止它!有的时候用一些简单的办法就可以得到你以前几百行代码的效果。

    LittleU
  • 数据结构与算法(三)

    当我们在记录这个算法的步骤的时候,不能写出“一个长度为N的有序数组中用二分查找需要的步骤为XX步”.这样写不仅浪费时间又啰嗦,这是我们不想要的,那么有什么办法简...

    LittleU
  • AAAI 2021论文接收列表放出,IJCAI 2020即将召开!AI顶会最新动态一览!

    https://aaai.org/Conferences/AAAI-21/wp-content/uploads/2020/12/AAAI-21_Accepted...

    AI科技评论
  • tomcat发布两个项目报错webAppKey重复设置

    org.springframework.web.util.Log4jConfigListener

    一笠风雨任生平
  • Android webview手动校验https证书(by 星空武哥)

    有些时候由于Android系统的bug或者其他的原因,导致我们的webview不能验证通过我们的https证书,最明显的例子就是华为手机mate7升级到Andr...

    砸漏
  • dwr:CSRF Security Error 问题解决

    初次使用dwr,做一个小demo,结果总是会弹出CSRF Security Error这个错误提示。关于dwr的介绍以后再说,自己初步打算把新接触的知识从一开始...

    the5fire
  • 盘点那些在我文章中出现过的书籍|文末有福利哦

    这次的文章主要盘点一下那些在我的文章的出现过的技术书籍。然后在文末送出一个购书福利。

    why技术
  • C#重试公用类

    少羽大怪兽
  • android蓝牙控制PC端代码分享

    在安卓端通过蓝牙发送指令到PC端,java程序接收指令,并执行相应的动作。其中指令格式有所规范,PC端的java程序通过robot库进行操作

    砸漏

扫码关注云+社区

领取腾讯云代金券