diff --git a/Assets/Scripts/Dialog System/LineAdvanceInput.cs b/Assets/Scripts/Dialog System/LineAdvanceInput.cs index eeaa52671..a0af9ee8d 100644 --- a/Assets/Scripts/Dialog System/LineAdvanceInput.cs +++ b/Assets/Scripts/Dialog System/LineAdvanceInput.cs @@ -49,7 +49,7 @@ namespace AibisDream private void LateUpdate() { - _handler.Handle(_curSyncToken, IsInputAvailable); + _handler.Handle(_curSyncToken, IsInputAvailable, IsPointerOverUI); } public void SwitchAdvanceHandler(AdvanceModeEnum advanceMode) @@ -77,12 +77,18 @@ namespace AibisDream && _curSyncToken.state != LineSyncState.Advanced; } + private bool IsPointerOverUI() + { + return UIManager.Instance != null + && UIManager.Instance.IsPointerOverUI(Input.mousePosition); + } + #endregion } public interface ILineAdvanceHandler { - void Handle(LineSyncToken token, Func isAvailable); + void Handle(LineSyncToken token, Func isAvailable, Func isPointerOverUI); static ILineAdvanceHandler Create(bool autoMode) { @@ -92,9 +98,12 @@ namespace AibisDream public class DefaultAdvanceHandler : ILineAdvanceHandler { - public void Handle(LineSyncToken token, Func isAvailable) + public void Handle(LineSyncToken token, Func isAvailable, Func isPointerOverUI) { - if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) + var pointerAdvance = Input.GetMouseButtonDown(0) && !isPointerOverUI(); + var keyboardAdvance = Input.GetKeyDown(KeyCode.Space); + + if (pointerAdvance || keyboardAdvance) { if (isAvailable()) { @@ -122,7 +131,7 @@ namespace AibisDream public class AutoAdvanceHandler : ILineAdvanceHandler { - public void Handle(LineSyncToken token, Func isAvailable) + public void Handle(LineSyncToken token, Func isAvailable, Func isPointerOverUI) { if (!isAvailable()) { @@ -136,7 +145,10 @@ namespace AibisDream return; } - if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) + var pointerAdvance = Input.GetMouseButtonDown(0) && !isPointerOverUI(); + var keyboardAdvance = Input.GetKeyDown(KeyCode.Space); + + if (pointerAdvance || keyboardAdvance) { HandleInput(token); } @@ -161,7 +173,7 @@ namespace AibisDream public class QuickAdvanceHandler : ILineAdvanceHandler { - public void Handle(LineSyncToken token, Func isAvailable) + public void Handle(LineSyncToken token, Func isAvailable, Func isPointerOverUI) { if (!isAvailable()) { @@ -180,4 +192,4 @@ namespace AibisDream } } } -} \ No newline at end of file +} diff --git a/Assets/Scripts/UI/UIManager.cs b/Assets/Scripts/UI/UIManager.cs index 77aa70056..675a8d0e7 100644 --- a/Assets/Scripts/UI/UIManager.cs +++ b/Assets/Scripts/UI/UIManager.cs @@ -242,6 +242,27 @@ namespace AibisDream return RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPos, UICamera, out localPoint); } + /// + /// 检查屏幕坐标是否命中主 UI Canvas 上会接收射线的元素。 + /// 对话 Canvas 不在此范围内,因此点击对话画面本身仍可正常推进。 + /// + public bool IsPointerOverUI(Vector2 screenPosition) + { + if (EventSystem.current == null || _raycaster == null) + { + return false; + } + + var eventData = new PointerEventData(EventSystem.current) + { + position = screenPosition + }; + + var results = new List(); + _raycaster.Raycast(eventData, results); + return results.Count > 0; + } + /// /// 检查鼠标是否在指定标记的 UI 区域上 ///