#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