Project_WL/AgentScripts/WL796_PixelProbe.cs

53 lines
2.3 KiB
C#

// 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<Graphic>(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<CanvasGroup>();
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();
}
}