using UnityEditor; using UnityEngine; using TMPro; using UnityEngine.UI; public class ReplaceTMPDropdownEditor : EditorWindow { [MenuItem("Tools/Replace TMP Dropdowns")] public static void ShowWindow() { GetWindow("Replace TMP Dropdowns"); } private void OnGUI() { GUILayout.Label("Replace TMP_Dropdowns with CustomTMPDropdown", EditorStyles.boldLabel); if (GUILayout.Button("Replace All TMP_Dropdowns in Scene (Include Hidden)")) { ReplaceAllDropdownsInScene(); } } private static void ReplaceAllDropdownsInScene() { int count = 0; // 遍历场景根对象 foreach (var root in UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects()) { count += ReplaceDropdownsRecursive(root.transform); } Debug.Log($"ReplaceTMPDropdownEditor: Replaced {count} TMP_Dropdowns with CustomTMPDropdown (including hidden)."); } private static int ReplaceDropdownsRecursive(Transform parent) { int replacedCount = 0; // 获取 TMP_Dropdown 组件(即使隐藏) TMP_Dropdown tmp = parent.GetComponent(); if (tmp != null && !(tmp is CustomTMPDropdown)) { GameObject go = tmp.gameObject; // 保存属性 var template = tmp.template; var captionText = tmp.captionText; var itemText = tmp.itemText; var options = tmp.options; // 删除旧组件 Object.DestroyImmediate(tmp, true); // 添加 CustomTMPDropdown CustomTMPDropdown newDropdown = go.AddComponent(); newDropdown.template = template; newDropdown.captionText = captionText; newDropdown.itemText = itemText; newDropdown.options = new System.Collections.Generic.List(options); newDropdown.alphaFadeSpeed = 0.15f; replacedCount++; } // 递归遍历子物体 foreach (Transform child in parent) { replacedCount += ReplaceDropdownsRecursive(child); } return replacedCount; } }