Files

42 lines
2.7 KiB
C#

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<Camera>(true);
var lights = UnityEngine.Object.FindObjectsOfType<Light>(true);
var renderers = UnityEngine.Object.FindObjectsOfType<Renderer>(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<UniversalAdditionalCameraData>()?.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.lightmapIndex<LightmapSettings.lightmaps.Length),
renderers=renderers.Take(12).Select(r=>new {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;
}
}