Skip to content

Instantly share code, notes, and snippets.

@zaki
Created January 16, 2020 10:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zaki/12429733eed6c4963135a0f68d275be5 to your computer and use it in GitHub Desktop.
Save zaki/12429733eed6c4963135a0f68d275be5 to your computer and use it in GitHub Desktop.
Clear unused properties left in the materials after changing shaders
using System.Text;
using UnityEngine;
using UnityEditor;
namespace Friday.Utilities
{
public class ClearShaderProperties : EditorWindow
{
private Material m_selectedMaterial;
private SerializedObject m_serializedObject;
[MenuItem("Friday/Material Cleanup")]
private static void MaterialCleanup()
{
var materials = AssetDatabase.FindAssets("t:material");
foreach (var guid in materials)
{
Cleanup(guid);
}
}
private static void Cleanup(string guid)
{
Material mat = AssetDatabase.LoadAssetAtPath<Material>(AssetDatabase.GUIDToAssetPath(guid));
SerializedObject so = new SerializedObject(mat);
var props = new[] {"m_Floats", "m_Colors", "m_TexEnvs"};
var m = "m_SavedProperties.";
bool hasChanged = false;
StringBuilder sb = new StringBuilder();
foreach (string prop in props)
{
SerializedProperty sp = so.FindProperty($"m_SavedProperties.{prop}");
if (sp != null && sp.isArray)
{
for (int i = sp.arraySize - 1; i >= 0; --i)
{
string propName = sp.GetArrayElementAtIndex(i).displayName;
if (!mat.HasProperty(propName))
{
sp.DeleteArrayElementAtIndex(i);
sb.Append($"\t{sp.name} / {propName}\n");
hasChanged = true;
}
}
}
}
if (hasChanged)
{
so.ApplyModifiedProperties();
Debug.Log($"Updating {mat.name}\n\nDeleted property list:\n{sb}");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment