using System; using System.IO; using System.Linq; using Newtonsoft.Json; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEngine.SceneManagement; // Read-only diagnosis of the actual running camp, without rendering an extra camera frame. public static class InspectCampLighting { public static string Run() { var pipeline = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; var cameras = UnityEngine.Object.FindObjectsOfType(true); var lights = UnityEngine.Object.FindObjectsOfType(true); var renderers = UnityEngine.Object.FindObjectsOfType(true).Where(r => r.gameObject.layer == 29).ToArray(); var report = new { time = DateTime.UtcNow, activeScene = SceneManager.GetActiveScene().path, scenes = Enumerable.Range(0,SceneManager.sceneCount).Select(i=>new { SceneManager.GetSceneAt(i).path, SceneManager.GetSceneAt(i).isLoaded }).ToArray(), maps = LightmapSettings.lightmaps.Length, ambient = RenderSettings.ambientMode.ToString(), sky = RenderSettings.ambientSkyColor.ToString(), equator = RenderSettings.ambientEquatorColor.ToString(), sun = RenderSettings.sun != null ? RenderSettings.sun.name : null, pipeline = pipeline != null ? pipeline.name : null, mainShadows = pipeline != null && pipeline.supportsMainLightShadows, shadowDistance = pipeline != null ? pipeline.shadowDistance : 0, cameras = cameras.Select(c => new { c.name, c.enabled, active = c.gameObject.activeInHierarchy, c.cullingMask, target = c.targetTexture != null ? c.targetTexture.name : null, shadows = c.GetComponent()?.renderShadows }).ToArray(), lights = lights.Select(l=>new { l.name, l.enabled, active = l.gameObject.activeInHierarchy, l.intensity, l.cullingMask, bake=l.lightmapBakeType.ToString(), shadows=l.shadows.ToString(), l.shadowStrength }).ToArray(), rendererCount=renderers.Length, lightmapped=renderers.Count(r=>r.lightmapIndex>=0 && r.lightmapIndexnew {r.name, r.lightmapIndex, shadows=r.shadowCastingMode.ToString(), r.receiveShadows, shader=r.sharedMaterial!=null?r.sharedMaterial.shader.name:null}).ToArray() }; string json = JsonConvert.SerializeObject(report,Formatting.Indented); string folder=Path.GetFullPath(Path.Combine(Application.dataPath,"../../Tools/output/camp_lighting")); Directory.CreateDirectory(folder); File.WriteAllText(Path.Combine(folder,"runtime_diagnosis.json"),json); return json; } }