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