Files
aibis-dream/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs
T
2025-01-17 21:05:06 +08:00

118 lines
3.5 KiB
C#

using System.Linq;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
namespace AibisDream.Framework
{
/// <summary>
/// EventTrigger扩展
/// </summary>
[RequireComponent(typeof(Collider2D))]
public class EventTriggerEx : EventTrigger
{
private IInteraction _interaction;
private void Awake()
{
_interaction = GetComponent<IInteraction>();
}
/// <summary>
/// 注册事件
/// </summary>
/// <param name="triggerType">事件类型</param>
/// <param name="action">函数</param>
public void Register(EventTriggerType triggerType, UnityAction<BaseEventData> action)
{
if (TryGetTriggerEvent(triggerType, out var triggerEvent))
{
triggerEvent.AddListener(action);
}
else
{
Debug.LogWarning($"{triggerType.ToString()}未添加");
}
}
/// <summary>
/// 卸载事件
/// </summary>
/// <param name="triggerType">事件类型</param>
/// <param name="action">函数</param>
public void UnRegister(EventTriggerType triggerType, UnityAction<BaseEventData> action)
{
if (TryGetTriggerEvent(triggerType, out var triggerEvent))
{
triggerEvent.RemoveListener(action);
}
else
{
Debug.LogWarning($"{triggerType.ToString()}未添加");
}
}
/// <summary>
/// 获取触发事件
/// </summary>
/// <param name="triggerType">事件类型</param>
/// <param name="triggerEvent">事件</param>
/// <returns>是否存在</returns>
private bool TryGetTriggerEvent(EventTriggerType triggerType, out TriggerEvent triggerEvent)
{
var entry = triggers.FirstOrDefault(item => item.eventID == triggerType);
if (entry == null)
{
triggerEvent = null;
return false;
}
else
{
triggerEvent = entry.callback;
return true;
}
}
public override void OnPointerEnter(PointerEventData data)
{
EventSystemEx.Instance.OnPointerEnter(_interaction);
base.OnPointerEnter(data);
}
public override void OnPointerExit(PointerEventData data)
{
EventSystemEx.Instance.OnPointerExit(_interaction);
base.OnPointerExit(data);
}
public override void OnPointerDown(PointerEventData eventData)
{
if (_interaction.IsAvailable)
{
EventSystemEx.Instance.OnPointerDown(_interaction);
base.OnPointerDown(eventData);
}
}
public override void OnPointerUp(PointerEventData eventData)
{
if (_interaction.IsAvailable)
{
EventSystemEx.Instance.OnPointerUp(_interaction);
base.OnPointerUp(eventData);
}
}
}
public interface IInteraction
{
// 判断是否激活,激活就正常显示鼠标,否则就显示禁用标志
public bool IsActive { get; }
// 判断是否可用,可用就正常显示鼠标,否则就保持原有标志不变
public bool IsAvailable { get; }
// 返回GameObject
public GameObject GetGameObject();
}
}