// WL796_PixelProbe.cs — 화면 특정 픽셀을 덮고 있는 활성 UI Graphic 을 전부 나열한다(정체불명 사각형 추적). // unity command run_script --file AgentScripts/WL796_PixelProbe.cs --entry WL796_PixelProbe.At --args '[30,20]' using System.Linq; using System.Text; using UnityEngine; using UnityEngine.UI; public static class WL796_PixelProbe { static Rect ScreenRect(RectTransform rt, Canvas canvas) { var corners = new Vector3[4]; rt.GetWorldCorners(corners); var cam = canvas != null && canvas.renderMode != RenderMode.ScreenSpaceOverlay ? canvas.worldCamera : null; Vector2 min = new Vector2(float.MaxValue, float.MaxValue), max = new Vector2(float.MinValue, float.MinValue); for (int i = 0; i < 4; i++) { Vector2 p = cam != null ? (Vector2)RectTransformUtility.WorldToScreenPoint(cam, corners[i]) : (Vector2)corners[i]; min = Vector2.Min(min, p); max = Vector2.Max(max, p); } return Rect.MinMaxRect(min.x, min.y, max.x, max.y); } static string Path(Transform t) { var sb = new StringBuilder(t.name); var p = t.parent; while (p != null) { sb.Insert(0, p.name + "/"); p = p.parent; } return sb.ToString(); } public static object At(float x, float y) { if (!Application.isPlaying) return "not playing"; var pt = new Vector2(x, y); var sb = new StringBuilder("point=" + pt + " screen=" + Screen.width + "x" + Screen.height + "\n"); var all = Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None) .Where(g => g.isActiveAndEnabled && g.gameObject.activeInHierarchy); foreach (var g in all) { var canvas = g.canvas; var r = ScreenRect(g.rectTransform, canvas); if (!r.Contains(pt)) continue; var cg = g.GetComponentInParent(); sb.AppendLine(" " + Path(g.transform) + " [" + g.GetType().Name + "] rect=" + r.ToString("F0") + " color=" + g.color + " a=" + g.color.a.ToString("F2") + (cg != null ? " parentCG.alpha=" + cg.alpha : "") + " sortOrder=" + (canvas != null ? canvas.sortingOrder : 0)); } return sb.ToString(); } }