// WL772_PlayCheck.cs — PD 지시 #772 M4 : Play 진입 후 맵 1개 상태 실측 (읽기 전용) // unity command run_script --file AgentScripts/WL772_PlayCheck.cs --entry WL772_PlayCheck.Run using System; using System.Linq; using System.Text; using UnityEngine; public static class WL772_PlayCheck { public static object Run() { if (!Application.isPlaying) return "not playing"; var sb = new StringBuilder(); // 로드된 맵 루트 = MapData 를 가진 오브젝트 var mds = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None); sb.Append("map=").Append(mds.Length > 0 ? mds[0].gameObject.name : "(none)"); var pcs = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None); sb.Append(" pc=").Append(pcs.Length > 0 ? pcs[0].transform.position.ToString("F2") : "(none)"); if (pcs.Length > 0) { var na = pcs[0].GetComponent(); sb.Append(" onNav=").Append(na != null ? na.isOnNavMesh.ToString() : "no-agent"); } int spawners = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).Length; int mobsAll = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Include, FindObjectsSortMode.None).Length; int mobsAct = UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None).Length; sb.Append(" spawners=").Append(spawners).Append(" mobsActive=").Append(mobsAct).Append("/pooled=").Append(mobsAll); int magenta = 0, rends = 0; foreach (var r in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None)) { rends++; foreach (var m in r.sharedMaterials) if (m == null || m.shader == null || m.shader.name == "Hidden/InternalErrorShader") magenta++; } sb.Append(" renderers=").Append(rends).Append(" magenta=").Append(magenta); var tri = UnityEngine.AI.NavMesh.CalculateTriangulation(); sb.Append(" navTris=").Append(tri.indices.Length / 3); return sb.ToString(); } // 마젠타(셰이더 깨짐/null 머티리얼) 렌더러를 이름·씬·머티리얼까지 열거 public static object Magenta() { if (!Application.isPlaying) return "not playing"; var sb = new StringBuilder(); var byKey = new System.Collections.Generic.Dictionary(); foreach (var r in UnityEngine.Object.FindObjectsByType(FindObjectsInactive.Exclude, FindObjectsSortMode.None)) { foreach (var m in r.sharedMaterials) { bool bad = (m == null) || (m.shader == null) || m.shader.name == "Hidden/InternalErrorShader"; if (!bad) continue; string path = r.name; var t2 = r.transform; int guard = 0; while (t2.parent != null && guard++ < 6) { t2 = t2.parent; path = t2.name + "/" + path; } string key = r.gameObject.scene.name + " | " + path + " | " + (m == null ? "(null material)" : m.name + " [" + (m.shader==null?"(null shader)":m.shader.name) + "]") + " | " + r.GetType().Name; byKey[key] = byKey.TryGetValue(key, out var v) ? v + 1 : 1; } } foreach (var kv in byKey) sb.AppendLine(kv.Value + " x " + kv.Key); sb.AppendLine("고유 " + byKey.Count + " · 합계 " + System.Linq.Enumerable.Sum(byKey.Values)); return sb.ToString(); } // 카메라 각도 고정(캡처 재현용) public static object Cam(float rotateAround) { if (!Application.isPlaying) return "not playing"; var cam = Camera.main; if (cam == null) return "no camera"; var rc = cam.GetComponents().FirstOrDefault(c => c != null && c.GetType().Name == "RealCamera"); if (rc == null) return "no RealCamera"; var f = rc.GetType().GetField("rotateAround", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (f == null) return "no rotateAround"; f.SetValue(rc, rotateAround); return "rotateAround=" + rotateAround; } }