From b14599d18cf8c7f48a2e4f348e994288f2668778 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 15 Jul 2026 16:51:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(dialog):=20=E4=BF=AE=E5=A4=8D=E7=82=B9?= =?UTF-8?q?=E5=87=BB=20UI=20=E6=97=B6=E5=AF=B9=E8=AF=9D=E8=A2=AB=E8=AF=AF?= =?UTF-8?q?=E6=8E=A8=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 LineAdvanceInput 中通过 UIManager.IsPointerOverUI 判断 鼠标是否位于主 UI Canvas 的射线接收元素上,避免点击录制工具 等 UI 时推进对话。 --- .../Scripts/Dialog System/LineAdvanceInput.cs | 28 +++++++++++++------ Assets/Scripts/UI/UIManager.cs | 21 ++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) 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 区域上 ///