com.alicizax.unity.ui.exten.../Runtime/UGUIExtension/Button/UIButtonSuper.cs

243 lines
6.9 KiB
C#
Raw Normal View History

2025-02-21 10:22:11 +08:00
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using System;
using UnityEngine.UI;
namespace AlicizaX.UI.Extension
{
public enum ButtonSoundType
{
Down,
Up,
Click,
Enter,
Exit,
Drag
}
[Serializable]
public class ButtonSoundCell
{
public ButtonSoundType ButtonSoundType = ButtonSoundType.Click;
public int ButtonUISoundName = 10007;
}
public delegate void ButtonBeginDragCallback(PointerEventData eventData);
public delegate void ButtonDragCallback(PointerEventData eventData);
public delegate void ButtonEndDragCallback(PointerEventData eventData);
public class UIButtonSuper : Button, IBeginDragHandler, IDragHandler, IEndDragHandler
{
public List<ButtonSoundCell> m_ButtonUISounds = new List<ButtonSoundCell>();
[Tooltip("是否可以点击")] public bool m_CanClick = true;
[Tooltip("是否可以双击")] public bool m_CanDoubleClick = false;
[Tooltip("双击间隔时长")] public float m_DoubleClickIntervalTime = 0.1f;
[Tooltip("双击事件")] public ButtonClickedEvent onDoubleClick;
[Tooltip("是否可以长按")] public bool m_CanLongPress = false;
[Tooltip("长按是否只响应一次")] public bool m_ResponseOnceByPress = false;
[Tooltip("长按满足间隔")] public float m_LongPressDurationTime = 1;
[Tooltip("长按事件")] public ButtonClickedEvent onPress;
//public ButtonClickedEvent onClick;
public ButtonBeginDragCallback onBeginDrag;
public ButtonDragCallback onDrag;
public ButtonEndDragCallback onEndDrag;
private bool isDown = false;
private bool isPress = false;
private bool isDownExit = false;
private float downTime = 0;
private int fingerId = int.MinValue;
public bool IsDraging
{
get { return fingerId != int.MinValue; }
} //摇杆拖拽状态
public int FingerId
{
get { return fingerId; }
}
private float clickIntervalTime = 0;
private int clickTimes = 0;
void Update()
{
if (isDown)
{
if (!m_CanLongPress)
{
return;
}
if (m_ResponseOnceByPress && isPress)
{
return;
}
downTime += Time.deltaTime;
if (downTime > m_LongPressDurationTime)
{
isPress = true;
onPress.Invoke();
}
}
if (clickTimes >= 1)
{
if (!m_CanLongPress && !m_CanDoubleClick && m_CanClick)
{
onClick.Invoke();
clickTimes = 0;
}
else
{
clickIntervalTime += Time.deltaTime;
if (clickIntervalTime >= m_DoubleClickIntervalTime)
{
if (clickTimes >= 2)
{
if (m_CanDoubleClick)
{
onDoubleClick.Invoke();
}
}
else
{
if (m_CanClick)
{
onClick.Invoke();
}
}
clickTimes = 0;
clickIntervalTime = 0;
}
}
}
}
/// <summary>
/// 是否按钮按下
/// </summary>
public bool IsDown
{
get { return isDown; }
}
/// <summary>
/// 是否按钮长按
/// </summary>
public bool IsPress
{
get { return isPress; }
}
/// <summary>
/// 是否按钮按下后离开按钮位置
/// </summary>
public bool IsDownExit
{
get { return isDownExit; }
}
public ButtonSoundCell GetButtonSound(ButtonSoundType buttonSoundType)
{
foreach (var buttonSound in m_ButtonUISounds)
{
if (buttonSound.ButtonSoundType == buttonSoundType)
{
return buttonSound;
}
}
return null;
}
private void PlayButtonSound(ButtonSoundType buttonSoundType)
{
ButtonSoundCell buttonSound = GetButtonSound(buttonSoundType);
if (buttonSound == null)
{
return;
}
// AlicizaFramework.SystemModule.Audio.Play(buttonSound.ButtonUISoundName);
}
public override void OnPointerEnter(PointerEventData eventData)
{
base.OnPointerEnter(eventData);
PlayButtonSound(ButtonSoundType.Enter);
}
public override void OnPointerDown(PointerEventData eventData)
{
base.OnPointerDown(eventData);
if (eventData.pointerId < -1 || IsDraging) return; //适配 Touch只响应一个Touch适配鼠标只响应左键
fingerId = eventData.pointerId;
isDown = true;
isDownExit = false;
downTime = 0;
PlayButtonSound(ButtonSoundType.Down);
}
public override void OnPointerUp(PointerEventData eventData)
{
base.OnPointerUp(eventData);
if (fingerId != eventData.pointerId) return; //正确的手指抬起时才会;
fingerId = int.MinValue;
isDown = false;
isDownExit = true;
PlayButtonSound(ButtonSoundType.Up);
}
public override void OnPointerExit(PointerEventData eventData)
{
base.OnPointerExit(eventData);
if (fingerId != eventData.pointerId) return; //正确的手指抬起时才会;
isPress = false;
isDownExit = true;
PlayButtonSound(ButtonSoundType.Exit);
}
public override void OnPointerClick(PointerEventData eventData)
{
if (!isPress)
{
clickTimes += 1;
}
else
isPress = false;
PlayButtonSound(ButtonSoundType.Click);
}
public void OnBeginDrag(PointerEventData eventData)
{
onBeginDrag?.Invoke(eventData);
}
public void OnDrag(PointerEventData eventData)
{
PlayButtonSound(ButtonSoundType.Drag);
onDrag?.Invoke(eventData);
}
public void OnEndDrag(PointerEventData eventData)
{
onEndDrag?.Invoke(eventData);
}
}
}