Files
bansonic_beta_main/Assets/Editor/RainbowDissolveMaterialCreator.cs
T

71 lines
2.7 KiB
C#

#if UNITY_EDITOR
using System.IO;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 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
/// </summary>
public static class RainbowDissolveMaterialCreator
{
// Shader Graph registers its shader name as "<m_Path>/<asset file name>".
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