// LIVE UI TUNER — paste into UnityExplorer's C# Console. Edit the knobs, Run, look, // repeat. Nothing persists; relaunching reverts everything. // // IMPORTANT: run this IN-GAME (not the main menu). Different scenes have different // canvases, and the overlapping text is in the gameplay HUD. // // scaleFactor = (screenW/refW)^(1-match) * (screenH/refH)^match // match=1 scales by HEIGHT (logical height stays 1080 = the design height). // Lowering match shrinks logical height below 1080 and CRAMPS things vertically. // ---- KNOBS ----------------------------------------------------------------- float MATCH = 1.0f; // 0 = scale by width, 1 = scale by height // HUD_SCALE shrinks/grows the HUD *without* cramping the layout. // <1 = smaller HUD + MORE logical room (use this to cure overlapping text) // Implemented by raising referenceResolution.y, because CanvasScaler.scaleFactor // is IGNORED in ScaleWithScreenSize mode (it only applies to ConstantPixelSize). float HUD_SCALE = 1.0f; // try 0.95, 0.9, 0.85 bool LIST_ONLY = false; // true = report current state, change nothing // ---------------------------------------------------------------------------- var log = new System.Text.StringBuilder(); log.AppendLine($"SCREEN {UnityEngine.Screen.width}x{UnityEngine.Screen.height} " + $"aspect={(float)UnityEngine.Screen.width / UnityEngine.Screen.height:F4}"); foreach (var cs in UnityEngine.Object.FindObjectsOfType()) { log.AppendLine($"BEFORE {cs.name}: mode={cs.uiScaleMode} ref={cs.referenceResolution} " + $"match={cs.matchWidthOrHeight} scaleFactor={cs.scaleFactor}"); if (!LIST_ONLY) { cs.matchWidthOrHeight = MATCH; if (HUD_SCALE > 0f && System.Math.Abs(HUD_SCALE - 1f) > 0.0001f) { // effective scale = screenH / refH, so refH = designH / HUD_SCALE var r = cs.referenceResolution; cs.referenceResolution = new UnityEngine.Vector2(r.x, 1080f / HUD_SCALE); log.AppendLine($" refResolution {r} -> {cs.referenceResolution}"); } } // report the resulting logical canvas the UI is laid out in var cv = cs.GetComponent(); float sf = cv ? cv.scaleFactor : 0f; if (sf > 0) log.AppendLine($"AFTER {cs.name}: effectiveScale={sf:F4} " + $"logicalCanvas={UnityEngine.Screen.width / sf:F0}x{UnityEngine.Screen.height / sf:F0}"); } // Every canvas in the scene — the overlapping text may live on one we haven't touched foreach (var cv in UnityEngine.Object.FindObjectsOfType()) log.AppendLine($"CANVAS {cv.name} mode={cv.renderMode} scale={cv.scaleFactor:F4} " + $"hasScaler={(cv.GetComponent() != null)} " + $"sortOrder={cv.sortingOrder}"); UnityExplorer.ExplorerCore.Log(log.ToString());