TIL AssetDatabase Ops

Sunder Iyer - May 5 '21 - - Dev Community

2021-05-04
May the fourth be with you

So I exported a SGB project to Unity and needed to change all the shaders on the exported materials. This is a tedious task to do by hand especially when there are many materials --- but fortunately, Unity makes Editor Scripting easy and you can perform batch operations on assets easily.

I learned about the AssetDatabase and how you can use it to find and manipulate assets. I slapped together a scriptable-wizard that takes two shader values and runs through all materials in the project and swaps the first with the second. This lets me target shaders that I know can be replaced properly.

using UnityEngine;
using UnityEditor;
using System.Collections;

public class Wizard : ScriptableWizard
{
    public Shader target;
    public Shader replacement;

    [MenuItem("Batch Ops/Wizard")]
    public static void SetWizard()
    {
        ScriptableWizard.DisplayWizard("Some Batch Op",typeof(Wizard),"Swap Shaders");
    }

    void OnWizardCreate()
    {
        string[] guids =  AssetDatabase.FindAssets("t:material");
        foreach (string guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            Material material = (Material) AssetDatabase.LoadAssetAtPath(path, typeof(Material));
            if (material.shader == target)
            {
                material.shader = replacement;
                Debug.Log("Replaced shader in " + material.name);
            }
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
}
Enter fullscreen mode Exit fullscreen mode

The following wizard shows up when I access it from the top menu.
Wizard and output log

Fortunately, the script ran with no issues and I was able to avoid tedious shader replacement. I'm sure it's prone to errors but I'll deal with those as they happen.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .