#if UNITY_EDITOR using System; using System.IO; using System.Linq; using UnityEditor; using UnityEngine; using UnityEngine.SceneManagement; using System.Collections.Generic; #if UNITY_2021_1_OR_NEWER using UnityEngine.UIElements; // for UIDocument #endif namespace MegaKoop.EditorTools { public static class UIToolkitCleanup { [MenuItem("Tools/MegaKoop/Cleanup UI Toolkit Assets (Backup & Remove)", priority = 50)] public static void CleanupUIToolkit() { string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); string backupRoot = $"Assets/_Backup_UIToolkit_{timestamp}"; Directory.CreateDirectory(backupRoot); // Collect UXML/USS assets var all = AssetDatabase.GetAllAssetPaths(); var toMove = all.Where(p => p.EndsWith(".uxml", StringComparison.OrdinalIgnoreCase) || p.EndsWith(".uss", StringComparison.OrdinalIgnoreCase)).ToList(); // Also move common PanelSettings assets by name toMove.AddRange(all.Where(p => Path.GetFileName(p).ToLower().Contains("panelsettings") && p.EndsWith(".asset", StringComparison.OrdinalIgnoreCase))); // Move known UI Toolkit scripts (optional) var uiToolkitScripts = new List { "Assets/UI/Scripts/MainMenuController.cs", "Assets/UI/Scripts/MultiplayerLobbyController.cs", "Assets/UI/Scripts/PanelSettingsSetup.cs", "Assets/UI/SimplePanelSettings.cs", "Assets/UI/Editor/CreatePanelSettings.cs" }; foreach (var path in toMove.Distinct()) { string dest = Path.Combine(backupRoot, Path.GetFileName(path)).Replace('\\','/'); var err = AssetDatabase.MoveAsset(path, dest); if (!string.IsNullOrEmpty(err)) { Debug.LogWarning($"[Cleanup] Move failed for {path}: {err}"); } } foreach (var path in uiToolkitScripts) { if (File.Exists(path)) { string dest = Path.Combine(backupRoot, Path.GetFileName(path)).Replace('\\','/'); var err = AssetDatabase.MoveAsset(path, dest); if (!string.IsNullOrEmpty(err)) { Debug.LogWarning($"[Cleanup] Move failed for {path}: {err}"); } } } AssetDatabase.Refresh(); Debug.Log($"[UIToolkitCleanup] Moved {toMove.Count} assets to {backupRoot}."); // Remove UIDocument components from all open scenes int removed = 0; #if UNITY_2021_1_OR_NEWER foreach (var go in GameObject.FindObjectsOfType()) { var doc = go.GetComponent(); if (doc != null) { Undo.DestroyObjectImmediate(doc); removed++; } } #endif Debug.Log($"[UIToolkitCleanup] Removed {removed} UIDocument components from the current scene(s).\nIf some scenes are not open, open them and re-run this to strip UIDocuments there as well."); } } } #endif