diff --git a/tools/unity_diag.cs b/tools/unity_diag.cs new file mode 100644 index 0000000..b374fa1 --- /dev/null +++ b/tools/unity_diag.cs @@ -0,0 +1,51 @@ +// UnityExplorer C# console diagnostic — paste into the C# Console tab, hit Run. +// Dumps cameras, Cinemachine lenses, and UI scalers so we can see what drives FOV +// and what breaks the HUD at ultrawide. Reflection-based so it compiles regardless +// of Cinemachine version/namespace (Unity 6 uses Unity.Cinemachine, older uses Cinemachine). +var sb = new System.Text.StringBuilder(); + +sb.AppendLine($"SCREEN {UnityEngine.Screen.width}x{UnityEngine.Screen.height} " + + $"aspect={(float)UnityEngine.Screen.width / UnityEngine.Screen.height:F4} " + + $"full={UnityEngine.Screen.fullScreenMode}"); + +foreach (var c in UnityEngine.Object.FindObjectsOfType()) + sb.AppendLine($"CAM {c.name} depth={c.depth} fov={c.fieldOfView:F2} aspect={c.aspect:F4} " + + $"phys={c.usePhysicalProperties} gate={c.gateFit} sensor={c.sensorSize} rect={c.rect} " + + $"ortho={c.orthographic} enabled={c.enabled}"); + +// --- Cinemachine (any version) via reflection --- +foreach (var mb in UnityEngine.Object.FindObjectsOfType()) +{ + var t = mb.GetType(); + if (t.FullName == null || t.FullName.IndexOf("Cinemachine", System.StringComparison.OrdinalIgnoreCase) < 0) + continue; + object lens = null; + var bf = System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | + System.Reflection.BindingFlags.Instance; + foreach (var name in new[] { "Lens", "m_Lens" }) + { + var p = t.GetProperty(name, bf); if (p != null) { lens = p.GetValue(mb); break; } + var f = t.GetField(name, bf); if (f != null) { lens = f.GetValue(mb); break; } + } + if (lens != null) + { + var lt = lens.GetType(); + object fov = null, mode = null; + foreach (var n in new[] { "FieldOfView", "m_FieldOfView" }) + { var f = lt.GetField(n, bf); if (f != null) { fov = f.GetValue(lens); break; } } + foreach (var n in new[] { "ModeOverride", "m_ModeOverride" }) + { var f = lt.GetField(n, bf); if (f != null) { mode = f.GetValue(lens); break; } } + sb.AppendLine($"CM {t.Name} '{mb.name}' lensFOV={fov} modeOverride={mode} enabled={mb.enabled}"); + } + else sb.AppendLine($"CM {t.Name} '{mb.name}' (no lens field) enabled={mb.enabled}"); +} + +// --- uGUI canvas scalers (HUD scaling at ultrawide) --- +foreach (var cs in UnityEngine.Object.FindObjectsOfType()) + sb.AppendLine($"UI {cs.name} mode={cs.uiScaleMode} ref={cs.referenceResolution} " + + $"match={cs.matchWidthOrHeight} screenMatch={cs.screenMatchMode}"); + +foreach (var cv in UnityEngine.Object.FindObjectsOfType()) + sb.AppendLine($"CANV {cv.name} mode={cv.renderMode} cam={(cv.worldCamera ? cv.worldCamera.name : "none")}"); + +UnityExplorer.ExplorerCore.Log(sb.ToString());