diff --git a/Runtime/XTable/Rendering/Component/XTableSelectionOverlay.cs b/Runtime/XTable/Rendering/Component/XTableSelectionOverlay.cs index 5891f4d..0f4da45 100644 --- a/Runtime/XTable/Rendering/Component/XTableSelectionOverlay.cs +++ b/Runtime/XTable/Rendering/Component/XTableSelectionOverlay.cs @@ -1,7 +1,7 @@ +using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; -using UnityEngine.Networking; using XericLibrary.Runtime.MacroLibrary; namespace XericUI.XTable.Rendering.Component @@ -21,20 +21,14 @@ namespace XericUI.XTable.Rendering.Component #region debug-point selection-overlay-config private void DebugReport(string point, string details) { - if (!Application.isPlaying) return; - string body = $"{{\"sessionId\":\"selection-playmode-input\",\"point\":\"{point}\",\"details\":\"{details}\"}}"; - var request = new UnityWebRequest("http://127.0.0.1:7777/event", "POST"); - request.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(body)); - request.downloadHandler = new DownloadHandlerBuffer(); - request.SetRequestHeader("Content-Type", "application/json"); - request.SendWebRequest(); + if (Application.isPlaying) + Debug.Log($"[XTableSelection] {point} object={name}; {details}", this); } #endregion public void Configure(XericUIActionTable table, int rowStart, int rowEnd, int colStart, int colEnd) { m_Table = table; - DebugReport("overlay-config", $"region={rowStart},{rowEnd},{colStart},{colEnd};active={gameObject.activeInHierarchy}"); m_RowStart = rowStart; m_RowEnd = rowEnd; m_ColStart = colStart; @@ -48,6 +42,7 @@ namespace XericUI.XTable.Rendering.Component rt.sizeDelta = region.size; EnsureVisuals(); RefreshVisual(); + DebugReport("overlay-config", $"region={m_RowStart},{m_RowEnd},{m_ColStart},{m_ColEnd};rect={rt.rect};position={rt.anchoredPosition};parent={transform.parent?.name};sibling={transform.GetSiblingIndex()}"); } public void RefreshVisual() @@ -83,8 +78,8 @@ namespace XericUI.XTable.Rendering.Component { int row = -1; int col = -1; - bool hit = m_Table != null && m_Table.TryGetCellFromScreenPoint(transform.RectTransform(), eventData.position, eventData.pressEventCamera, true, out row, out col); - DebugReport("pointer-down", $"hit={hit};position={eventData.position};rect={transform.RectTransform().rect}"); + bool hit = TryGetCellFromOverlayPoint(eventData.position, eventData.pressEventCamera, out row, out col); + DebugReport("pointer-down", $"hit={hit};row={row};col={col};position={eventData.position};rect={transform.RectTransform().rect};dragHandler={eventData.pointerDrag?.name};pressHandler={eventData.pointerPress?.name}"); if (!hit) return; m_Dragging = true; @@ -94,8 +89,15 @@ namespace XericUI.XTable.Rendering.Component public void OnDrag(PointerEventData eventData) { - if (!m_Dragging || m_Table == null) return; - m_Table.UpdateSelectionDrag(transform.RectTransform(), eventData.position, eventData.pressEventCamera); + if (!m_Dragging || m_Table == null) + { + DebugReport("drag-ignored", $"dragging={m_Dragging};table={m_Table != null};dragHandler={eventData.pointerDrag?.name}"); + return; + } + bool hit = TryGetCellFromOverlayPoint(eventData.position, eventData.pressEventCamera, out int row, out int col); + DebugReport("drag", $"hit={hit};row={row};col={col};position={eventData.position};dragHandler={eventData.pointerDrag?.name}"); + if (hit) + m_Table.UpdateSelectionDragToCell(row, col); eventData.Use(); } @@ -108,6 +110,18 @@ namespace XericUI.XTable.Rendering.Component public void OnEndDrag(PointerEventData eventData) => EndDrag(); #endregion + private void Update() + { + if (!Application.isPlaying || !Input.GetMouseButtonDown(0) || EventSystem.current == null) return; + var data = new PointerEventData(EventSystem.current) { position = Input.mousePosition }; + var results = new List(); + EventSystem.current.RaycastAll(data, results); + string hits = string.Empty; + for (int i = 0; i < results.Count && i < 5; i++) + hits += $"{i}:{results[i].gameObject.name}/{results[i].module.GetType().Name} "; + DebugReport("raycast", $"mouse={Input.mousePosition};hits={hits}"); + } + private void OnDisable() => EndDrag(); private void OnDestroy() => EndDrag(); @@ -118,6 +132,15 @@ namespace XericUI.XTable.Rendering.Component m_Table?.EndSelection(); } + private bool TryGetCellFromOverlayPoint(Vector2 screenPoint, Camera eventCamera, out int row, out int col) + { + row = col = -1; + if (m_Table == null || !RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.RectTransform(), screenPoint, eventCamera, out Vector2 local)) + return false; + Rect region = m_Table.GetTableRect(m_RowStart, m_RowEnd, m_ColStart, m_ColEnd); + return m_Table.TryGetCellFromTablePoint(new Vector2(region.x + local.x, region.y - local.y), true, out row, out col); + } + private void EnsureVisuals() { var input = GetComponent(); diff --git a/Runtime/XTable/Rendering/Component/XericUIActionTable.Border.cs b/Runtime/XTable/Rendering/Component/XericUIActionTable.Border.cs index 83bd588..26cc4a7 100644 --- a/Runtime/XTable/Rendering/Component/XericUIActionTable.Border.cs +++ b/Runtime/XTable/Rendering/Component/XericUIActionTable.Border.cs @@ -24,7 +24,10 @@ namespace XericUI.XTable.Rendering.Component private UILineRendererV2 GetOrCreateBorderRenderer() { if (m_BorderRenderer != null) + { + m_BorderRenderer.raycastTarget = false; return m_BorderRenderer; + } Transform contentT = ContentTransform; // 查找已有对象 @@ -49,6 +52,7 @@ namespace XericUI.XTable.Rendering.Component rt.sizeDelta = new Vector2(m_TotalWidth + pad, m_TotalHeight + pad); m_BorderRenderer = go.GetComponent(); + m_BorderRenderer.raycastTarget = false; return m_BorderRenderer; } @@ -161,7 +165,11 @@ namespace XericUI.XTable.Rendering.Component private static UILineRendererV2 GetOrCreateFrozenBorderRenderer(Transform parent, ref UILineRendererV2 renderer, string name) { - if (renderer != null) return renderer; + if (renderer != null) + { + renderer.raycastTarget = false; + return renderer; + } if (parent == null) return null; var go = new GameObject(name, typeof(RectTransform), typeof(CanvasRenderer), typeof(UILineRendererV2)); go.hideFlags = HideFlags.DontSave | HideFlags.HideInHierarchy; @@ -171,6 +179,7 @@ namespace XericUI.XTable.Rendering.Component rt.anchorMax = new Vector2(0, 1); rt.pivot = new Vector2(0, 1); renderer = go.GetComponent(); + renderer.raycastTarget = false; return renderer; } diff --git a/Runtime/XTable/Rendering/Component/XericUIActionTable.Freeze.cs b/Runtime/XTable/Rendering/Component/XericUIActionTable.Freeze.cs index 1cd9195..14ca5b2 100644 --- a/Runtime/XTable/Rendering/Component/XericUIActionTable.Freeze.cs +++ b/Runtime/XTable/Rendering/Component/XericUIActionTable.Freeze.cs @@ -177,8 +177,9 @@ namespace XericUI.XTable.Rendering.Component go.transform.SetParent(parent, false); overlay = go.GetComponent(); } - overlay.transform.SetAsLastSibling(); + // Overlay 必须处于当前区域最上层,才能先于边框和其他 Graphic 接收 PointerDown/Drag。 overlay.Configure(this, rowStart, rowEnd, colStart, colEnd); + overlay.transform.SetAsLastSibling(); return overlay; } diff --git a/Runtime/XTable/Rendering/Component/XericUIActionTable.Selection.cs b/Runtime/XTable/Rendering/Component/XericUIActionTable.Selection.cs index afdcb29..285733d 100644 --- a/Runtime/XTable/Rendering/Component/XericUIActionTable.Selection.cs +++ b/Runtime/XTable/Rendering/Component/XericUIActionTable.Selection.cs @@ -21,7 +21,13 @@ namespace XericUI.XTable.Rendering.Component m_LastSelectionPointer = screenPoint; m_SelectionPointerCamera = eventCamera; if (TryGetCellFromScreenPoint(source, screenPoint, eventCamera, true, out int row, out int col)) - SetNormalizedSelection(SelectionHandle.StartRow, SelectionHandle.StartCol, row, col); + UpdateSelectionDragToCell(row, col); + } + + internal void UpdateSelectionDragToCell(int row, int col) + { + if (!m_SelectionDragActive) return; + SetNormalizedSelection(SelectionHandle.StartRow, SelectionHandle.StartCol, row, col); } internal void NormalizeAndSelect(int startRow, int startCol, int endRow, int endCol) =>