using System.IO; using UnityEditor; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; namespace Luneraria.EditorTools { /// /// Rendering setup of the project (URP asset and renderer, linear colour space), idempotent. /// Unity -batchmode -projectPath . -executeMethod Luneraria.EditorTools.LuneProjectSetup.ConfigureRendering /// public static class LuneProjectSetup { public const string SettingsFolder = "Assets/Luneraria/Settings/Rendering"; public const string PipelinePath = SettingsFolder + "/Luneraria_URP.asset"; public const string RendererPath = SettingsFolder + "/Luneraria_URP_Renderer.asset"; public static void ConfigureRendering() { int code = 0; try { Configure(); } catch (System.Exception error) { Debug.LogError("LUNE_SETUP failed: " + error); code = 1; } EditorApplication.Exit(code); } public static UniversalRenderPipelineAsset Configure() { Directory.CreateDirectory(SettingsFolder); AssetDatabase.Refresh(); var asset = AssetDatabase.LoadAssetAtPath(PipelinePath); if (asset == null) { var renderer = ScriptableObject.CreateInstance(); AssetDatabase.CreateAsset(renderer, RendererPath); ResourceReloader.ReloadAllNullIn(renderer, UniversalRenderPipelineAsset.packagePath); asset = UniversalRenderPipelineAsset.Create(renderer); AssetDatabase.CreateAsset(asset, PipelinePath); } // The Godot sun reaches 190 m with four splits (scripts/luneraria/view/lune_world.gd). asset.shadowDistance = 190f; asset.shadowCascadeCount = 4; asset.supportsHDR = true; asset.msaaSampleCount = 4; asset.useSRPBatcher = true; EditorUtility.SetDirty(asset); GraphicsSettings.defaultRenderPipeline = asset; int current = QualitySettings.GetQualityLevel(); for (int level = 0; level < QualitySettings.names.Length; level++) { QualitySettings.SetQualityLevel(level, false); QualitySettings.renderPipeline = asset; } QualitySettings.SetQualityLevel(current, false); PlayerSettings.colorSpace = ColorSpace.Linear; MoveInto("Assets/UniversalRenderPipelineGlobalSettings.asset", SettingsFolder + "/UniversalRenderPipelineGlobalSettings.asset"); MoveInto("Assets/DefaultVolumeProfile.asset", SettingsFolder + "/DefaultVolumeProfile.asset"); AssetDatabase.SaveAssets(); Debug.Log("LUNE_SETUP rendering: " + PipelinePath + ", colour space " + PlayerSettings.colorSpace); return asset; } static void MoveInto(string from, string to) { if (File.Exists(from) && !File.Exists(to)) { string error = AssetDatabase.MoveAsset(from, to); if (!string.IsNullOrEmpty(error)) Debug.LogWarning("LUNE_SETUP move " + from + ": " + error); } } } }