From 57c49b1e2f59087abbfb6b2f64970dc558145a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Wed, 10 Dec 2025 17:38:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LocalizationDropdownField.cs | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Editor/ToolBarExtension/LocalizationDropdownField.cs b/Editor/ToolBarExtension/LocalizationDropdownField.cs index b2c3e39..d8f50f4 100644 --- a/Editor/ToolBarExtension/LocalizationDropdownField.cs +++ b/Editor/ToolBarExtension/LocalizationDropdownField.cs @@ -1,10 +1,13 @@ using System; +using System.Collections.Generic; using System.Linq; +using System.Reflection; using AlicizaX.Localization.Runtime; using AlicizaX; using AlicizaX.Localization.Editor; using Paps.UnityToolbarExtenderUIToolkit; using UnityEditor; +using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.UIElements; @@ -56,6 +59,7 @@ public class LocalizationDropdownField : IMGUIContainer void ClickToolsSubmenu(string langaugeName) { EditorPrefs.SetString(LocalizationComponent.PrefsKey, langaugeName); + InvokeOnValidateInScene(); Debug.Log(langaugeName); } @@ -63,4 +67,45 @@ public class LocalizationDropdownField : IMGUIContainer { return EditorPrefs.GetString(LocalizationComponent.PrefsKey, "None"); } + + + public static void InvokeOnValidateInScene() + { + + System.Type targetType = AlicizaX.Utility.Assembly.GetType("UnityEngine.UI.UXTextMeshPro"); + MethodInfo onValidateMethod = targetType.GetMethod("OnValidate", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); + + if (onValidateMethod == null) + { + Debug.LogWarning($"类型 {targetType.Name} 没有找到 OnValidate 方法(可能是用其他签名或不存在)"); + return; + } + + List components = new List(); + + components = GameObject.FindObjectsOfType(targetType).ToList().Select(t => (t as Component)).ToList(); + + if (components.Count == 0) + { + Debug.Log("未在场景中找到任何目标组件。"); + return; + } + + int count = 0; + + var scenesToMarkDirty = EditorSceneManager.GetActiveScene(); + + foreach (var comp in components) + { + Undo.RecordObject(comp, "Invoke OnValidate"); + onValidateMethod.Invoke(comp, null); + EditorUtility.SetDirty(comp); + count++; + } + + if (count > 0) + { + EditorSceneManager.MarkSceneDirty(scenesToMarkDirty); + } + } }