Unity 基于EventTrigger的UI事件系统

一、主要思路

其实主要原理就是通过继承EventTrigger并重写相应的函数实现的,只是对其做了一个封装,更方便使用了;

当对某个GameObject使用UIEventManager.Get()函数时,会自动检查该对象是否挂载了UIEventManager脚本,如果没有,会动态的帮他将该脚本挂载上去(动态挂载多少会影响性能),具体代码如下:

        public static UIEventManager Get(GameObject obj)
        {
            UIEventManager temp = obj.GetComponent();
            if (temp == null)
            {
                temp = obj.AddComponent();
            }
            return temp;
        }

为每一个UI响应事件申明唯一对应的UnityEvent做为回调函数,例如,对于点击事件,可以这样声明:

public UnityAction OnClickCallBack;

接下来重写对应的事件,在函数体中触发回调函数即可实现对于某一事件的响应了,例如,同样是对于点击事件:

        public override void OnPointerClick(PointerEventData eventData)
        {
            base.OnPointerClick(eventData);
            if (OnClickCallBack != null)
            {
                OnClickCallBack(eventData);
            }
        }

其他的事件都以上面的格式逐个添加就可以了,EventTrigger可以重写的函数包括以下:

Unity 基于EventTrigger的UI事件系统_第1张图片

二、使用方法

假如你想让你UI中的某个图片实现点击功能,在你的某个UI的控制模块中(例如MVC框架的Controller),可以这样写:

UIEventManager.Get(closeBtn).OnClickCallBack += CloseView;

closeBtn即为你要点击的那个图片,CloseView即为点击事件的回调函数,如下:

        public void CloseView(PointerEventData data)
        {
            Debug.Log("click!!!");
        }

三、完整代码

做为示范,只实现了点击事件,鼠标移入,鼠标离开,如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;

namespace EventSys
{
    public class UIEventManager : EventTrigger
    {
        public static UIEventManager Get(GameObject obj)
        {
            UIEventManager temp = obj.GetComponent();
            if (temp == null)
            {
                temp = obj.AddComponent();
            }
            return temp;
        }
        public UnityAction OnClickCallBack;
        public UnityAction OnPointerEnterCallBack;
        public UnityAction OnPointerLeaveCallBack;

        public override void OnPointerClick(PointerEventData eventData)
        {
            base.OnPointerClick(eventData);
            if (OnClickCallBack != null)
            {
                OnClickCallBack(eventData);
            }
        }
        public override void OnPointerEnter(PointerEventData eventData)
        {
            base.OnPointerEnter(eventData);
            if (OnPointerEnterCallBack != null)
            {
                OnPointerEnterCallBack(eventData);
            }
        }
        public override void OnPointerExit(PointerEventData eventData)
        {
            base.OnPointerExit(eventData);
            if (OnPointerLeaveCallBack != null)
            {
                OnPointerLeaveCallBack(eventData);
            }
        }
    }
}

和事件管理器申明在同一个命名空间中,关于事件管理器,可以转到以下链接:

Unity 基于UnityEvent实现轻量级事件管理器

你可能感兴趣的:(Unity,轻量级游戏框架,Unity,TPS游戏设计)