using System; using System.IO; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public static class TuneHomeCampExposure { const string ProfilePath = "Assets/Bundles/Scenes/Town/HomeCamp/HomeCampVolume.asset"; public static string Apply() { if (EditorApplication.isPlaying) throw new InvalidOperationException("Apply in Edit Mode."); var profile = AssetDatabase.LoadAssetAtPath(ProfilePath); if (!profile || !profile.TryGet(out var color)) throw new InvalidOperationException("Missing camp ColorAdjustments"); float before = color.postExposure.value; Undo.RecordObject(color, "Lower HomeCamp exposure"); color.postExposure.Override(.30f); EditorUtility.SetDirty(color); AssetDatabase.SaveAssetIfDirty(color); return "Saved HomeCamp postExposure " + before + " -> " + color.postExposure.value + " EV"; } public static string Capture() { var hud = HotUpdate.UI.UiManager.Instance?.Get("UI_MainHUD"); if (!hud) throw new InvalidOperationException("Start the isolated home preview first."); var camera = GameObject.Find("HomeMobileTestCamera").GetComponent(); var canvas = hud.GetComponent(); var target = new RenderTexture(Screen.width, Screen.height, 24); var pixels = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false); var mode = canvas.renderMode; var worldCamera = canvas.worldCamera; var mask = camera.cullingMask; var previous = RenderTexture.active; try { camera.targetTexture = target; camera.cullingMask = 1 << LayerMask.NameToLayer("UI"); canvas.renderMode = RenderMode.ScreenSpaceCamera; canvas.worldCamera = camera; canvas.planeDistance = 1; Canvas.ForceUpdateCanvases(); camera.Render(); RenderTexture.active = target; pixels.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0); pixels.Apply(); var dir = Path.GetFullPath(Path.Combine(Application.dataPath, "../../Tools/output/homecamp_exposure_20261104")); Directory.CreateDirectory(dir); var path = Path.Combine(dir, "home_exposure_030.png"); File.WriteAllBytes(path, pixels.EncodeToPNG()); return path; } finally { RenderTexture.active = previous; camera.targetTexture = null; camera.cullingMask = mask; canvas.renderMode = mode; canvas.worldCamera = worldCamera; target.Release(); UnityEngine.Object.Destroy(target); UnityEngine.Object.Destroy(pixels); } } }