#if UNITY_EDITOR using System.IO; using UnityEditor; using UnityEngine; /// /// Editor utility that builds ready-to-use materials from the Rainbow-Cats /// "Unity Dissolve HDR Shaders" pack. We resolve shaders through Shader.Find so /// Unity fills in each graph's real fileID + default property values — hand-writing /// a .mat's shader reference is error-prone and usually ends in a pink material. /// Menu: Tools > Rainbow Dissolve > Create Materials /// public static class RainbowDissolveMaterialCreator { // Shader Graph registers its shader name as "/". private const string DissolveUrpShaderName = "Shader Graphs/Dissolve Lit URP Shader"; private const string OutlineUrpShaderName = "Shader Graphs/HDR Outline Lit URP Shader"; private const string DissolveHdrpShaderName = "Shader Graphs/Dissolve Lit HDRP Shader"; private const string OutputFolder = "Assets/Rainbow-Cats-Unity-Dissolve-HDR-Shaders-main/Materials"; [MenuItem("Tools/Rainbow Dissolve/Create Materials")] public static void CreateMaterials() { EnsureFolder(OutputFolder); // URP shaders (this project is URP 17). HDRP variant is created only if that // shader compiles in the current pipeline, otherwise it would be pink. CreateMaterial(DissolveUrpShaderName, "M_Dissolve_URP"); CreateMaterial(OutlineUrpShaderName, "M_HDROutline_URP"); CreateMaterial(DissolveHdrpShaderName, "M_Dissolve_HDRP"); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } private static void CreateMaterial(string shaderName, string materialName) { Shader shader = Shader.Find(shaderName); if (shader == null) { Debug.LogWarning($"[RainbowDissolve] Shader not found: \"{shaderName}\". " + "Skipped (likely a different render pipeline or the graph hasn't imported yet)."); return; } string path = $"{OutputFolder}/{materialName}.mat"; var material = new Material(shader) { name = materialName }; AssetDatabase.CreateAsset(material, AssetDatabase.GenerateUniqueAssetPath(path)); Debug.Log($"[RainbowDissolve] Created material {path} using shader \"{shaderName}\".", material); } private static void EnsureFolder(string assetFolder) { if (AssetDatabase.IsValidFolder(assetFolder)) { return; } string parent = Path.GetDirectoryName(assetFolder).Replace('\\', '/'); string leaf = Path.GetFileName(assetFolder); if (!AssetDatabase.IsValidFolder(parent)) { EnsureFolder(parent); } AssetDatabase.CreateFolder(parent, leaf); } } #endif