#if UNITY_EDITOR using System.IO; using System.Linq; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement; /// Force-reimport XTerrain, punch ground lightmap contrast, recapture HomeCamp review. public static class FixHomeCampShadowPunch { const string Root = "Assets/Bundles/Scenes/Town/HomeCamp"; const string ScenePath = Root + "/HomeCamp.unity"; const string Review = "D:/UD/AI/AIGame/Tools/output/homecamp_review"; public static string Run() { AssetDatabase.ImportAsset("Assets/Bundles/Shaders/XShader/XTerrain.shader", ImportAssetOptions.ForceSynchronousImport); AssetDatabase.ImportAsset("Assets/Bundles/Shaders/XShader/XTerrain_Base.hlsl", ImportAssetOptions.ForceSynchronousImport); var mat = AssetDatabase.LoadAssetAtPath(Root + "/ground_terrain.mat"); if (!mat) return "FAIL: no ground mat"; // Stronger than 1.45 — busy albedo still hid plaza shade after the CBUFFER fix. mat.SetFloat("_LightmapContrast", 1.85f); EditorUtility.SetDirty(mat); AssetDatabase.SaveAssetIfDirty(mat); var scene = EditorSceneManager.OpenScene(ScenePath, OpenSceneMode.Single); var root = scene.GetRootGameObjects().Single(g => g.name == "HomeCamp"); var ground = root.transform.Find("Ground")?.GetComponentInChildren(); var live = ground ? ground.sharedMaterial.GetFloat("_LightmapContrast") : -1f; // Warm shader variants so Capture does not draw the first frame without LIGHTMAP_ON. ShaderUtil.allowAsyncCompilation = false; var cam = root.GetComponentInChildren(); Capture(cam, Review + "/homecamp_portrait.png", 1080, 1920); Capture(cam, Review + "/homecamp_tall.png", 1080, 2400); return "contrast=" + live.ToString("F2") + " groundLM=" + (ground ? ground.lightmapIndex.ToString() : "?") + " maps=" + LightmapSettings.lightmaps.Length; } static void Capture(Camera camera, string file, int w, int h) { Directory.CreateDirectory(Path.GetDirectoryName(file)); var rt = RenderTexture.GetTemporary(w, h, 24, RenderTextureFormat.ARGB32); var old = RenderTexture.active; var oldT = camera.targetTexture; var oldA = camera.aspect; var tex = new Texture2D(w, h, TextureFormat.RGB24, false); try { camera.aspect = (float)w / h; camera.targetTexture = rt; RenderTexture.active = rt; camera.Render(); camera.Render(); tex.ReadPixels(new Rect(0, 0, w, h), 0, 0); tex.Apply(); File.WriteAllBytes(file, tex.EncodeToPNG()); } finally { camera.targetTexture = oldT; camera.aspect = oldA; RenderTexture.active = old; RenderTexture.ReleaseTemporary(rt); Object.DestroyImmediate(tex); } } } #endif