// WL-816h — 콘솔 error/warning 수와 error 메시지만 뽑아 파일로 (토큰 절약) using System.Reflection; using UnityEngine; public static class WL816h_Console { public static void Dump() { var t = System.Type.GetType("UnityEditor.LogEntries,UnityEditor"); var sb = new System.Text.StringBuilder(); object[] args = { 0, 0, 0 }; t.GetMethod("GetCountsByType", BindingFlags.Public | BindingFlags.Static).Invoke(null, args); sb.AppendLine("error=" + args[0] + " warning=" + args[1] + " log=" + args[2]); int n = (int)t.GetMethod("StartGettingEntries", BindingFlags.Public | BindingFlags.Static).Invoke(null, null); var entryType = System.Type.GetType("UnityEditor.LogEntry,UnityEditor"); var entry = System.Activator.CreateInstance(entryType); var getEntry = t.GetMethod("GetEntryInternal", BindingFlags.Public | BindingFlags.Static); var msgF = entryType.GetField("message", BindingFlags.Public | BindingFlags.Instance); var modeF = entryType.GetField("mode", BindingFlags.Public | BindingFlags.Instance); var seen = new System.Collections.Generic.Dictionary(); for (int i = 0; i < n; i++) { object[] a2 = { i, entry }; getEntry.Invoke(null, a2); int mode = (int)modeF.GetValue(a2[1]); // Error(1) | Assert(2) | Fatal(0x10) | ScriptingError(0x100) | ScriptingException(0x400) | ScriptCompileError(0x800) bool isErr = (mode & (1 | 2 | 0x10 | 0x100 | 0x400 | 0x800 | 0x2000)) != 0; if (!isErr) continue; string m = (string)msgF.GetValue(a2[1]); if (m == null) continue; // 메시지 1줄 + 스택 앞 3줄 (누가 냈는지 보려고) var lines = m.Split('\n'); var key = new System.Text.StringBuilder(lines[0].Length > 140 ? lines[0].Substring(0, 140) : lines[0]); for (int k = 1; k < lines.Length && k <= 3; k++) { var s = lines[k].Trim(); if (s.Length == 0) continue; if (s.Length > 120) s = s.Substring(0, 120); key.Append("\n ").Append(s); } string kk = key.ToString(); seen[kk] = seen.ContainsKey(kk) ? seen[kk] + 1 : 1; } t.GetMethod("EndGettingEntries", BindingFlags.Public | BindingFlags.Static).Invoke(null, null); sb.AppendLine("--- error 메시지(중복 묶음) ---"); foreach (var kv in seen) sb.AppendLine(" ×" + kv.Value + " " + kv.Key); if (seen.Count == 0) sb.AppendLine(" (없음)"); System.IO.File.WriteAllText("AgentScripts/WL816h_CONSOLE.txt", sb.ToString()); Debug.Log("[816h console]\n" + sb); } public static void Clear() { var t = System.Type.GetType("UnityEditor.LogEntries,UnityEditor"); t.GetMethod("Clear", BindingFlags.Public | BindingFlags.Static).Invoke(null, null); } }