原文出自:https://www.cnblogs.com/SouthBegonia/p/16093683.html
添加了右键支持,但是只有单击,注意不要跟项目中其他鼠标右键的功能冲突,鼠标中键也需要的话自己改造一下就行了
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
#if UNITY_EDITOR
using UnityEditor;
#endif
/*
* ButtonEx扩展按钮组件
*
* 【功能】
* - 多种按钮交互事件
* - Button无损转ButtonEx(Button右上角三个点设置里调用)
*/
/// <summary>
/// 扩展按钮组件
/// </summary>
[AddComponentMenu("UI/ButtonEx")]
public class ButtonEx : Button
{
/// <summary>
/// 按钮交互事件枚举
/// </summary>
[System.Flags]
public enum EventType
{
Click = 1 << 0,
LongClick = 1 << 1,
Down = 1 << 2,
Up = 1 << 3,
Enter = 1 << 4,
Exit = 1 << 5,
DoubleClick = 1 << 6,
}
[SerializeField] private EventType m_EventType = EventType.Click;
/// <summary>
/// 长按判定时间
/// </summary>
public float onLongWaitTime = 0.2f;
/// <summary>
/// 是否重复抛出长按事件(false:长按onLongWaitTime后只触发一次onLongClick true:从onDown起,每onLongWaitTime触发一次onLongClick)
/// </summary>
public bool onLongContinue = false;
/// <summary>
/// 双击判定时间(两次OnDown的间隔时间小于此值即判定为一次双击,但完全不影响onClick的触发)
/// </summary>
public float onDoubleClickTime = 0.5f;
/*[SerializeField]
private ButtonClickedEvent m_OnClick = new ButtonClickedEvent(); //点击事件*/
[SerializeField] private ButtonClickedEvent m_OnEnterLongClick = new ButtonClickedEvent(); //长按事件(触发一次)
[SerializeField] private ButtonClickedEvent m_OnLongClick = new ButtonClickedEvent(); //长按事件(触发一次)
[SerializeField] private ButtonClickedEvent m_OnDown = new ButtonClickedEvent(); //按下事件
[SerializeField] private ButtonClickedEvent m_OnUp = new ButtonClickedEvent(); //抬起事件
[SerializeField] private ButtonClickedEvent m_OnEnter = new ButtonClickedEvent(); //进入事件
[SerializeField] private ButtonClickedEvent m_OnExit = new ButtonClickedEvent(); //移出事件
[SerializeField] private ButtonClickedEvent m_onDoubleClick = new ButtonClickedEvent(); //双击事件
[SerializeField] private ButtonClickedEvent m_onRightClick = new ButtonClickedEvent(); //右键点击事件
[SerializeField] private ButtonClickedEvent m_OnClickEx = new ButtonClickedEvent(); //左键点击事件
private Coroutine log;
private bool isPointerDown = false;
private bool isPointerInside = false;
private bool isEnterButton;
#region 对外属性
/// <summary>
/// 是否被按下
/// </summary>
public bool isDown
{
get { return i