Unity鼠标事件

事件:

1、ClickEvent

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:ClickEvent
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:点击功能
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

namespace LastZero.BaseEvent
{
    public class ClickEvent : MonoBehaviour, IPointerClickHandler
    {
        public UnityEvent singleClick = new UnityEvent();
        public UnityEvent doubleClick = new UnityEvent();
        public UnityEvent rightClick = new UnityEvent();
        public UnityEvent middleClick = new UnityEvent();

        public void OnPointerClick(PointerEventData eventData)
        {
            if (eventData.clickCount == 1 && eventData.button == PointerEventData.InputButton.Left)
            {
                singleClick.Invoke();
            }
            else if (eventData.clickCount == 2 && eventData.button == PointerEventData.InputButton.Left)
            {
                doubleClick.Invoke();
            }
            else if (eventData.button == PointerEventData.InputButton.Right)
            {
                rightClick.Invoke();
            }
            else if (eventData.button == PointerEventData.InputButton.Middle)
            {
                middleClick.Invoke();
            }
        }
    }
}

2、StayEvent

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:StayEvent
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:鼠标停留
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

namespace LastZero.BaseEvent
{
    public class StayEvent : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
    {
        public UnityEvent enterEvent = new UnityEvent();
        public UnityEvent stayEvent = new UnityEvent();
        public UnityEvent exitEvent = new UnityEvent();

        private bool isStay;

        public void OnPointerEnter(PointerEventData eventData)
        {
            isStay = true;
            enterEvent.Invoke();
        }

        public void OnPointerExit(PointerEventData eventData)
        {
            isStay = false;
            exitEvent.Invoke();
        }

        private void Update()
        {
            if (isStay)
                stayEvent.Invoke();
        }
    }
}

3、RepeatEvent

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:RepeatEvent
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:鼠标长按
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

namespace LastZero.BaseEvent
{
    public class RepeatEvent : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
    {
        public UnityEvent downEvent = new UnityEvent();
        public UnityEvent repeatEvent = new UnityEvent();
        public UnityEvent upEvent = new UnityEvent();

        private bool isRepeating;

        public void OnPointerDown(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
            {
                isRepeating = true;
                downEvent.Invoke();
            }
        }

        public void OnPointerExit(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
            {
                isRepeating = false;
            }
        }

        public void OnPointerUp(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
            {
                isRepeating = false;
                upEvent.Invoke();
            }
        }

        private void Update()
        {
            if (isRepeating)
                repeatEvent.Invoke();
        }
    }
}

4、DragEvent

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:DragEvent
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:拖拽功能
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;

namespace LastZero.BaseEvent
{
    public class DragEvent : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
    {
        public UnityEvent beginDrag = new UnityEvent();
        public UnityEvent drag = new UnityEvent();
        public UnityEvent endDrag = new UnityEvent();

        public void OnBeginDrag(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
                beginDrag.Invoke();
        }

        public void OnDrag(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
                drag.Invoke();
        }

        public void OnEndDrag(PointerEventData eventData)
        {
            if (eventData.button == PointerEventData.InputButton.Left)
                endDrag.Invoke();
        }
    }
}

事件添加

1、ClickEventController

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:EventController
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:添加鼠标点击事件
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;

using LastZero.BaseEvent;

namespace LastZero.Event
{
    public static partial class EventController
    {
        /// <summary>
        /// 添加单击事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddSingleClickEvent(this GameObject target,UnityAction act)
        {
            if (target.GetComponent<ClickEvent>() == null)
                target.AddComponent<ClickEvent>();

            target.GetComponent<ClickEvent>().singleClick.AddListener(act);
        }

        /// <summary>
        /// 添加双击事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddDoubleClickEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<ClickEvent>() == null)
                target.AddComponent<ClickEvent>();

            target.GetComponent<ClickEvent>().doubleClick.AddListener(act);
        }

        /// <summary>
        /// 添加右击事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddRightClickEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<ClickEvent>() == null)
                target.AddComponent<ClickEvent>();

            target.GetComponent<ClickEvent>().rightClick.AddListener(act);
        }

        /// <summary>
        /// 添加中键点击事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddMiddleClickEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<ClickEvent>() == null)
                target.AddComponent<ClickEvent>();

            target.GetComponent<ClickEvent>().middleClick.AddListener(act);
        }

        /// <summary>
        /// 移除点击事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void RemoveClickEvent(this GameObject target)
        {
            if (target.GetComponent<ClickEvent>())
                Object.Destroy(target.GetComponent<ClickEvent>());
        }
    }
}

2、StayEventController

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:EventController
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:添加鼠标停留事件
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;

using LastZero.BaseEvent;

namespace LastZero.Event
{
    public static partial class EventController
    {
        /// <summary>
        /// 添加鼠标进入功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddEnterEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<StayEvent>() == null)
                target.AddComponent<StayEvent>();

            target.GetComponent<StayEvent>().enterEvent.AddListener(act);
        }

        /// <summary>
        /// 添加鼠标停留功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddStayEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<StayEvent>() == null)
                target.AddComponent<StayEvent>();

            target.GetComponent<StayEvent>().stayEvent.AddListener(act);
        }

        /// <summary>
        /// 添加鼠标离开功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddExitEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<StayEvent>() == null)
                target.AddComponent<StayEvent>();

            target.GetComponent<StayEvent>().exitEvent.AddListener(act);
        }

        /// <summary>
        /// 移除停留事件
        /// </summary>
        /// <param name="target">目标</param>
        public static void RemoveStayEvent(this GameObject target)
        {
            if (target.GetComponent<StayEvent>())
                Object.Destroy(target.GetComponent<StayEvent>());
        }
    }
}

3、RepeatEventController

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:EventController
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:添加鼠标长按事件
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;

using LastZero.BaseEvent;

namespace LastZero.Event
{
    public static partial class EventController
    {
        /// <summary>
        /// 添加按下功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddDownEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<RepeatEvent>() == null)
                target.AddComponent<RepeatEvent>();

            target.GetComponent<RepeatEvent>().downEvent.AddListener(act);
        }

        /// <summary>
        /// 添加抬起功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddUpEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<RepeatEvent>() == null)
                target.AddComponent<RepeatEvent>();

            target.GetComponent<RepeatEvent>().upEvent.AddListener(act);
        }

        /// <summary>
        /// 添加长按功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddRepeatEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<RepeatEvent>() == null)
                target.AddComponent<RepeatEvent>();

            target.GetComponent<RepeatEvent>().repeatEvent.AddListener(act);
        }

        /// <summary>
        /// 移除长按事件
        /// <param name="target">目标</param>
        public static void RemoveRepeatEvent(this GameObject target)
        {
            if (target.GetComponent<RepeatEvent>())
                Object.Destroy(target.GetComponent<RepeatEvent>());
        }
    }
}

4、DragEventController

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:EventController
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:添加鼠标拖拽事件
******************************************************************************/

using UnityEngine;
using UnityEngine.Events;

using LastZero.BaseEvent;

namespace LastZero.Event
{
    public static partial class EventController
    {
        /// <summary>
        /// 添加开始拖拽事件
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddBeginDragEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<DragEvent>() == null)
                target.AddComponent<DragEvent>();

            target.GetComponent<DragEvent>().beginDrag.AddListener(act);
        }

        /// <summary>
        /// 添加拖拽功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddDragEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<DragEvent>() == null)
                target.AddComponent<DragEvent>();

            target.GetComponent<DragEvent>().drag.AddListener(act);
        }

        /// <summary>
        /// 添加拖拽结束功能
        /// </summary>
        /// <param name="target">目标</param>
        /// <param name="act">事件</param>
        public static void AddEndDragEvent(this GameObject target, UnityAction act)
        {
            if (target.GetComponent<DragEvent>() == null)
                target.AddComponent<DragEvent>();

            target.GetComponent<DragEvent>().endDrag.AddListener(act);
        }

        /// <summary>
        /// 移除拖拽事件
        /// </summary>
        /// <param name="target">目标</param>
        public static void RemoveDragEvent(this GameObject target)
        {
            if (target.GetComponent<DragEvent>())
                Object.Destroy(target.GetComponent<DragEvent>());
        }
    }
}

事件移除

/************************************************************
* 版本声明:v1.0.0
* 类 名 称:EventController
* 创建日期:11/13/2019 9:08:40 AM
* 作者名称:末零
* 功能描述:移除事件
******************************************************************************/

using System.Reflection;

namespace LastZero.Event
{
    public partial class EventController
    {
        /// <summary>
        /// 移除事件
        /// </summary>
        /// <param name="objectHasEvents">带有事件的物体</param>
        /// <param name="eventName">事件名称</param>
        public static void RemoveAllEvent(object objectHasEvents, string eventName = "")
        {
            EventInfo[] events = objectHasEvents.GetType().GetEvents(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            for (int i = 0; i < events.Length; i++)
            {
                EventInfo ei = events[i];

                if (eventName == "")
                {
                    FieldInfo fi = events[i].DeclaringType.GetField(events[i].Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    if (fi != null)
                    {
                        fi.SetValue(objectHasEvents, null);
                    }
                }
                else if (ei.Name == eventName)
                {
                    FieldInfo fi = events[i].DeclaringType.GetField(events[i].Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
                    if (fi != null)
                    {
                        fi.SetValue(objectHasEvents, null);
                    }
                    break;
                }
            }
        }
    }
}

返回目录

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值