diff --git a/Assets/Scripts/Framework/EventSystemKit/EventSystemEx.cs b/Assets/Scripts/Framework/EventSystemKit/EventSystemEx.cs index baf2de0a5..20a34b25d 100644 --- a/Assets/Scripts/Framework/EventSystemKit/EventSystemEx.cs +++ b/Assets/Scripts/Framework/EventSystemKit/EventSystemEx.cs @@ -90,6 +90,20 @@ namespace AibisDream.Framework #endregion + /// + /// 兜底:鼠标左键已抬起时强制清空 holding/dragging。 + /// 防止 EventTrigger 在 isLocked 时跳过 Up/EndDrag 清理后光标一直停在抓取。 + /// + private void LateUpdate() + { + if (Input.GetMouseButton(0)) return; + + if (holdingObjList.Count > 0) + holdingObjList.Clear(); + if (draggingObjList.Count > 0) + draggingObjList.Clear(); + } + private void HandleDialogueComplete() { isLocked = false; diff --git a/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs b/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs index baec45557..efc63fee2 100644 --- a/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs +++ b/Assets/Scripts/Framework/EventSystemKit/EventTriggerEx.cs @@ -12,7 +12,18 @@ namespace AibisDream.Framework public class EventTriggerEx : EventTrigger { private IInteraction _interaction; - + + private IInteraction Interaction + { + get + { + // 惰性获取:bridge 可能在 EventTriggerEx 之后才 AddComponent + if (_interaction == null) + _interaction = GetComponent(); + return _interaction; + } + } + private void Awake() { _interaction = GetComponent(); @@ -73,15 +84,26 @@ namespace AibisDream.Framework } } + private bool CanStartInteraction() + { + return Interaction != null + && Interaction.IsAvailable + && EventSystemEx.Instance != null + && !EventSystemEx.Instance.isLocked; + } + public override void OnPointerEnter(PointerEventData data) { - if (_interaction != null) EventSystemEx.Instance.OnPointerEnter(_interaction); + if (Interaction != null && EventSystemEx.Instance != null) + EventSystemEx.Instance.OnPointerEnter(Interaction); base.OnPointerEnter(data); } public override void OnPointerExit(PointerEventData data) { - if (_interaction != null) EventSystemEx.Instance.OnPointerExit(_interaction); + // 退出必须始终清理,否则旋转/细长 Collider 丢 Exit 时会卡住光标 + if (Interaction != null && EventSystemEx.Instance != null) + EventSystemEx.Instance.OnPointerExit(Interaction); base.OnPointerExit(data); } @@ -89,57 +111,59 @@ namespace AibisDream.Framework { // 对话等场景 isLocked 时仍要让 EventTrigger 上注册的回调执行(如塔罗 PointerDown), // 否则会出现能 Hover、但 Down/Up/Click 全不进组件的问题。 - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) - EventSystemEx.Instance.OnPointerDown(_interaction); + // 仅「开始」交互时受 isLocked / IsAvailable 门控;清理路径见 Up/EndDrag。 + if (CanStartInteraction()) + EventSystemEx.Instance.OnPointerDown(Interaction); base.OnPointerDown(eventData); } public override void OnPointerUp(PointerEventData eventData) { - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) - EventSystemEx.Instance.OnPointerUp(_interaction); + // 松手必须始终清理 holding,否则充能结束开对话把 isLocked 置真后会永远卡在抓取光标 + if (Interaction != null && EventSystemEx.Instance != null) + EventSystemEx.Instance.OnPointerUp(Interaction); base.OnPointerUp(eventData); } public override void OnDrag(PointerEventData eventData) { - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) + if (CanStartInteraction()) { - EventSystemEx.Instance.OnDrag(_interaction); + EventSystemEx.Instance.OnDrag(Interaction); base.OnDrag(eventData); } } public override void OnEndDrag(PointerEventData eventData) { - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) - { - EventSystemEx.Instance.OnEndDrag(_interaction); - base.OnEndDrag(eventData); - } + // 与 PointerUp 相同:清理不受 isLocked 门控 + if (Interaction != null && EventSystemEx.Instance != null) + EventSystemEx.Instance.OnEndDrag(Interaction); + base.OnEndDrag(eventData); } public override void OnBeginDrag(PointerEventData eventData) { - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) + if (CanStartInteraction()) { - EventSystemEx.Instance.OnBeginDrag(_interaction); + EventSystemEx.Instance.OnBeginDrag(Interaction); base.OnBeginDrag(eventData); } } public override void OnPointerClick(PointerEventData eventData) { - if (_interaction != null && _interaction.IsAvailable && !EventSystemEx.Instance.isLocked) + if (CanStartInteraction()) { - // EventSystemEx.Instance.OnPointerClick(_interaction); + // EventSystemEx.Instance.OnPointerClick(Interaction); } base.OnPointerClick(eventData); } void OnDestroy() { - EventSystemEx.Instance.UnRegister(_interaction); + if (EventSystemEx.Instance != null && Interaction != null) + EventSystemEx.Instance.UnRegister(Interaction); } } @@ -154,4 +178,4 @@ namespace AibisDream.Framework // 返回GameObject public GameObject GetGameObject(); } -} \ No newline at end of file +}