修复content无法选中单元格的问题

This commit is contained in:
2026-07-29 14:14:17 +08:00
parent 5917c0361b
commit 71f5004484
4 changed files with 55 additions and 16 deletions
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using UnityEngine.UI; using UnityEngine.UI;
using UnityEngine.Networking;
using XericLibrary.Runtime.MacroLibrary; using XericLibrary.Runtime.MacroLibrary;
namespace XericUI.XTable.Rendering.Component namespace XericUI.XTable.Rendering.Component
@@ -21,20 +21,14 @@ namespace XericUI.XTable.Rendering.Component
#region debug-point selection-overlay-config #region debug-point selection-overlay-config
private void DebugReport(string point, string details) private void DebugReport(string point, string details)
{ {
if (!Application.isPlaying) return; if (Application.isPlaying)
string body = $"{{\"sessionId\":\"selection-playmode-input\",\"point\":\"{point}\",\"details\":\"{details}\"}}"; Debug.Log($"[XTableSelection] {point} object={name}; {details}", this);
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();
} }
#endregion #endregion
public void Configure(XericUIActionTable table, int rowStart, int rowEnd, int colStart, int colEnd) public void Configure(XericUIActionTable table, int rowStart, int rowEnd, int colStart, int colEnd)
{ {
m_Table = table; m_Table = table;
DebugReport("overlay-config", $"region={rowStart},{rowEnd},{colStart},{colEnd};active={gameObject.activeInHierarchy}");
m_RowStart = rowStart; m_RowStart = rowStart;
m_RowEnd = rowEnd; m_RowEnd = rowEnd;
m_ColStart = colStart; m_ColStart = colStart;
@@ -48,6 +42,7 @@ namespace XericUI.XTable.Rendering.Component
rt.sizeDelta = region.size; rt.sizeDelta = region.size;
EnsureVisuals(); EnsureVisuals();
RefreshVisual(); 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() public void RefreshVisual()
@@ -83,8 +78,8 @@ namespace XericUI.XTable.Rendering.Component
{ {
int row = -1; int row = -1;
int col = -1; int col = -1;
bool hit = m_Table != null && m_Table.TryGetCellFromScreenPoint(transform.RectTransform(), eventData.position, eventData.pressEventCamera, true, out row, out col); bool hit = TryGetCellFromOverlayPoint(eventData.position, eventData.pressEventCamera, out row, out col);
DebugReport("pointer-down", $"hit={hit};position={eventData.position};rect={transform.RectTransform().rect}"); 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) if (!hit)
return; return;
m_Dragging = true; m_Dragging = true;
@@ -94,8 +89,15 @@ namespace XericUI.XTable.Rendering.Component
public void OnDrag(PointerEventData eventData) public void OnDrag(PointerEventData eventData)
{ {
if (!m_Dragging || m_Table == null) return; if (!m_Dragging || m_Table == null)
m_Table.UpdateSelectionDrag(transform.RectTransform(), eventData.position, eventData.pressEventCamera); {
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(); eventData.Use();
} }
@@ -108,6 +110,18 @@ namespace XericUI.XTable.Rendering.Component
public void OnEndDrag(PointerEventData eventData) => EndDrag(); public void OnEndDrag(PointerEventData eventData) => EndDrag();
#endregion #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<RaycastResult>();
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 OnDisable() => EndDrag();
private void OnDestroy() => EndDrag(); private void OnDestroy() => EndDrag();
@@ -118,6 +132,15 @@ namespace XericUI.XTable.Rendering.Component
m_Table?.EndSelection(); 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() private void EnsureVisuals()
{ {
var input = GetComponent<Image>(); var input = GetComponent<Image>();
@@ -24,7 +24,10 @@ namespace XericUI.XTable.Rendering.Component
private UILineRendererV2 GetOrCreateBorderRenderer() private UILineRendererV2 GetOrCreateBorderRenderer()
{ {
if (m_BorderRenderer != null) if (m_BorderRenderer != null)
{
m_BorderRenderer.raycastTarget = false;
return m_BorderRenderer; return m_BorderRenderer;
}
Transform contentT = ContentTransform; Transform contentT = ContentTransform;
// 查找已有对象 // 查找已有对象
@@ -49,6 +52,7 @@ namespace XericUI.XTable.Rendering.Component
rt.sizeDelta = new Vector2(m_TotalWidth + pad, m_TotalHeight + pad); rt.sizeDelta = new Vector2(m_TotalWidth + pad, m_TotalHeight + pad);
m_BorderRenderer = go.GetComponent<UILineRendererV2>(); m_BorderRenderer = go.GetComponent<UILineRendererV2>();
m_BorderRenderer.raycastTarget = false;
return m_BorderRenderer; return m_BorderRenderer;
} }
@@ -161,7 +165,11 @@ namespace XericUI.XTable.Rendering.Component
private static UILineRendererV2 GetOrCreateFrozenBorderRenderer(Transform parent, private static UILineRendererV2 GetOrCreateFrozenBorderRenderer(Transform parent,
ref UILineRendererV2 renderer, string name) ref UILineRendererV2 renderer, string name)
{ {
if (renderer != null) return renderer; if (renderer != null)
{
renderer.raycastTarget = false;
return renderer;
}
if (parent == null) return null; if (parent == null) return null;
var go = new GameObject(name, typeof(RectTransform), typeof(CanvasRenderer), typeof(UILineRendererV2)); var go = new GameObject(name, typeof(RectTransform), typeof(CanvasRenderer), typeof(UILineRendererV2));
go.hideFlags = HideFlags.DontSave | HideFlags.HideInHierarchy; go.hideFlags = HideFlags.DontSave | HideFlags.HideInHierarchy;
@@ -171,6 +179,7 @@ namespace XericUI.XTable.Rendering.Component
rt.anchorMax = new Vector2(0, 1); rt.anchorMax = new Vector2(0, 1);
rt.pivot = new Vector2(0, 1); rt.pivot = new Vector2(0, 1);
renderer = go.GetComponent<UILineRendererV2>(); renderer = go.GetComponent<UILineRendererV2>();
renderer.raycastTarget = false;
return renderer; return renderer;
} }
@@ -177,8 +177,9 @@ namespace XericUI.XTable.Rendering.Component
go.transform.SetParent(parent, false); go.transform.SetParent(parent, false);
overlay = go.GetComponent<XTableSelectionOverlay>(); overlay = go.GetComponent<XTableSelectionOverlay>();
} }
overlay.transform.SetAsLastSibling(); // Overlay 必须处于当前区域最上层,才能先于边框和其他 Graphic 接收 PointerDown/Drag。
overlay.Configure(this, rowStart, rowEnd, colStart, colEnd); overlay.Configure(this, rowStart, rowEnd, colStart, colEnd);
overlay.transform.SetAsLastSibling();
return overlay; return overlay;
} }
@@ -21,7 +21,13 @@ namespace XericUI.XTable.Rendering.Component
m_LastSelectionPointer = screenPoint; m_LastSelectionPointer = screenPoint;
m_SelectionPointerCamera = eventCamera; m_SelectionPointerCamera = eventCamera;
if (TryGetCellFromScreenPoint(source, screenPoint, eventCamera, true, out int row, out int col)) 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) => internal void NormalizeAndSelect(int startRow, int startCol, int endRow, int endCol) =>