#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
///
/// Editor utility to clear _GrayscaleTex from materials.
/// Useful for cleaning up material previews after runtime testing.
///
public class ClearGrayscaleTextures : EditorWindow
{
private bool showWarning = true;
[MenuItem("Tools/MesshingAround/Clear GrayscaleTex from Materials")]
static void ShowWindow()
{
GetWindow("Clear GrayscaleTex");
}
void OnGUI()
{
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Clear GrayscaleTex from Materials", EditorStyles.boldLabel);
EditorGUILayout.Space(5);
EditorGUILayout.HelpBox(
"This tool clears the _GrayscaleTex property from all materials.\n\n" +
"This is useful for cleaning up material previews in the Project window. " +
"The grayscale texture will be re-applied automatically at runtime by PotionTextureSetup.",
MessageType.Info
);
EditorGUILayout.Space(10);
// Warning box
if (showWarning)
{
EditorGUILayout.HelpBox(
"⚠️ IMPORTANT WARNINGS:\n\n" +
"• Material Instances: If you have material instances in your scene (created via 'Prepare for Timeline'), " +
"you may need to reset them after running this tool.\n\n" +
"• White Materials: After clearing, materials in the scene may appear white or without the grayscale texture " +
"until you enter Play mode or force a repaint (Play/Stop).\n\n" +
"• This operation affects ALL materials in the project with _GrayscaleTex property.",
MessageType.Warning
);
}
EditorGUILayout.Space(10);
showWarning = EditorGUILayout.ToggleLeft("Show warnings", showWarning);
EditorGUILayout.Space(10);
GUI.backgroundColor = new Color(0.8f, 0.4f, 0.4f);
if (GUILayout.Button("Clear _GrayscaleTex from All Materials", GUILayout.Height(40)))
{
if (EditorUtility.DisplayDialog(
"Clear GrayscaleTex",
"Are you sure you want to clear _GrayscaleTex from all materials?\n\n" +
"This will affect all materials in the project.\n" +
"Material instances may need to be recreated.",
"Yes, Clear",
"Cancel"))
{
ClearAllGrayscaleTextures();
}
}
GUI.backgroundColor = Color.white;
EditorGUILayout.Space(10);
EditorGUILayout.HelpBox(
"💡 TIP: After running this tool:\n" +
"1. Enter Play mode and Stop to refresh materials in the scene\n" +
"2. If materials are still white, re-assign the material to the Renderer\n" +
"3. If using Timeline, you may need to re-run 'Prepare for Timeline' on affected objects",
MessageType.Info
);
}
void ClearAllGrayscaleTextures()
{
string[] guids = AssetDatabase.FindAssets("t:Material");
int clearedCount = 0;
int totalChecked = 0;
EditorUtility.DisplayProgressBar("Clearing GrayscaleTex", "Processing materials...", 0f);
try
{
for (int i = 0; i < guids.Length; i++)
{
string path = AssetDatabase.GUIDToAssetPath(guids[i]);
Material mat = AssetDatabase.LoadAssetAtPath(path);
if (mat != null)
{
totalChecked++;
if (mat.HasProperty("_GrayscaleTex"))
{
Texture currentTex = mat.GetTexture("_GrayscaleTex");
if (currentTex != null)
{
mat.SetTexture("_GrayscaleTex", null);
EditorUtility.SetDirty(mat);
clearedCount++;
Debug.Log($"✓ Cleared _GrayscaleTex from: {mat.name} (was: {currentTex.name})");
}
}
}
float progress = (float)i / guids.Length;
EditorUtility.DisplayProgressBar("Clearing GrayscaleTex", $"Processing {i + 1}/{guids.Length}", progress);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
finally
{
EditorUtility.ClearProgressBar();
}
// Show results dialog
string message = $"Operation completed!\n\n" +
$"• Materials checked: {totalChecked}\n" +
$"• Materials cleared: {clearedCount}\n\n" +
$"Remember to:\n" +
$"1. Enter Play mode to refresh scene materials\n" +
$"2. Re-run 'Prepare for Timeline' if needed";
EditorUtility.DisplayDialog("Clear GrayscaleTex - Complete", message, "OK");
Debug.Log($"===== CLEAR GRAYSCALETEX COMPLETE =====");
Debug.Log($"✅ Cleared _GrayscaleTex from {clearedCount}/{totalChecked} material(s)");
}
}
#endif