using System.Collections.Generic; using UnityEditor; using UnityEngine; [CustomEditor(typeof(CommonLanguageAdapter), true)] [CanEditMultipleObjects] public class CommonLanguageAdapterEditor : Editor { private Dictionary m_FoldoutStates = new Dictionary(); private void OnEnable() { CommonLanguageAdapterHelper.Initialize(); if (target is CommonLanguageAdapter adapter) { if (!adapter.HasConfig(CommonLanguageAdapter.DefaultLangId)) { adapter.ReadCurrentToConfig(CommonLanguageAdapter.DefaultLangId); EditorUtility.SetDirty(adapter); } foreach (var langId in adapter.GetConfiguredLanguages()) m_FoldoutStates.TryAdd(langId, false); } } public override void OnInspectorGUI() { var adapter = target as CommonLanguageAdapter; DrawBasicInfo(adapter); EditorGUILayout.Space(); DrawLanguageConfigs(adapter); if (GUI.changed) EditorUtility.SetDirty(target); } private void DrawBasicInfo(CommonLanguageAdapter adapter) { using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { EditorGUILayout.LabelField("基本信息", EditorStyles.boldLabel); EditorGUI.BeginChangeCheck(); RectTransform newTarget = (RectTransform)EditorGUILayout.ObjectField("目标 RectTransform", adapter.TargetRectTransform, typeof(RectTransform), true); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(adapter, "Update Basic Info"); adapter.TargetRectTransform = newTarget; } EditorGUILayout.HelpBox("留空则默认控制本物体的 RectTransform。修改组件状态 (enabled) 会直接影响其所在 GameObject 的 Active 状态。", MessageType.Info); } } private void DrawLanguageConfigs(CommonLanguageAdapter adapter) { using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { EditorGUILayout.LabelField("语言排版配置", EditorStyles.boldLabel); EditorGUILayout.HelpBox("default仅用于编辑时恢复初始状态,无对应语言配置时用组件当前状态", MessageType.Info); foreach (var langId in adapter.GetConfiguredLanguages()) DrawLanguageConfigItem(adapter, langId); EditorGUILayout.Space(); DrawAddLanguageConfig(adapter); } } private void DrawLanguageConfigItem(CommonLanguageAdapter adapter, string langId) { m_FoldoutStates.TryAdd(langId, false); int presetIndex = System.Array.IndexOf(CommonLanguageAdapterHelper.PresetLanguageIds, langId); string name = presetIndex >= 0 ? CommonLanguageAdapterHelper.PresetLanguageNames[presetIndex] : CommonLanguageAdapter.GetLanguageShowName(langId); string label = string.IsNullOrEmpty(name) ? langId : $"{langId} ({name})"; EditorGUI.indentLevel++; if (langId == CommonLanguageAdapter.DefaultLangId) GUI.backgroundColor = new Color(1f, 0.9f, 0.7f); m_FoldoutStates[langId] = EditorGUILayout.Foldout(m_FoldoutStates[langId], label, true); GUI.backgroundColor = Color.white; if (m_FoldoutStates[langId]) { EditorGUI.indentLevel++; var config = adapter.LanguageConfigs.Get(langId); if (config != null) { DrawConfigItem(config); EditorGUILayout.Space(); DrawConfigItemActions(adapter, langId); } EditorGUI.indentLevel--; } EditorGUI.indentLevel--; } private void DrawConfigItem(CommonLanguageConfigItem cfg) { EditorGUILayout.LabelField("RectTransform 配置", EditorStyles.miniBoldLabel); EditorGUI.BeginChangeCheck(); cfg.anchoredPosition = EditorGUILayout.Vector2Field("Anchored Position", cfg.anchoredPosition); cfg.sizeDelta = EditorGUILayout.Vector2Field("Size Delta", cfg.sizeDelta); cfg.anchorMin = EditorGUILayout.Vector2Field("Anchor Min", cfg.anchorMin); cfg.anchorMax = EditorGUILayout.Vector2Field("Anchor Max", cfg.anchorMax); cfg.pivot = EditorGUILayout.Vector2Field("Pivot", cfg.pivot); cfg.localScale = EditorGUILayout.Vector3Field("Local Scale", cfg.localScale); cfg.localRotation = EditorGUILayout.Vector3Field("Local Rotation", cfg.localRotation); EditorGUILayout.Space(); EditorGUILayout.LabelField("基础配置", EditorStyles.miniBoldLabel); cfg.enabled = EditorGUILayout.Toggle("显示 (Active)", cfg.enabled); if (EditorGUI.EndChangeCheck()) EditorUtility.SetDirty(target); } private void DrawConfigItemActions(CommonLanguageAdapter adapter, string langId) { using (new EditorGUILayout.HorizontalScope()) { GUILayout.Space(EditorGUI.indentLevel * 15f); if (GUILayout.Button("从当前读取", GUILayout.Width(80))) { Undo.RecordObject(adapter, "Read Current Config"); adapter.ReadCurrentToConfig(langId); } if (GUILayout.Button("应用", GUILayout.Width(60))) { Undo.RecordObject(adapter, "Apply Config"); adapter.ApplyConfig(langId); } using (new EditorGUI.DisabledScope(langId == CommonLanguageAdapter.DefaultLangId)) { if (GUILayout.Button("删除", GUILayout.Width(50))) { Undo.RecordObject(adapter, "Remove Config"); adapter.RemoveConfig(langId); m_FoldoutStates.Remove(langId); } } } } private void DrawAddLanguageConfig(CommonLanguageAdapter adapter) { EditorGUILayout.BeginHorizontal(); GUILayout.Space(15f); EditorGUILayout.LabelField("添加预设语言:", GUILayout.Width(100)); float viewWidth = EditorGUIUtility.currentViewWidth - 30f; float currentWidth = 115f; float buttonWidth = 64f; for (int i = 0; i < CommonLanguageAdapterHelper.PresetLanguageIds.Length; i++) { string langId = CommonLanguageAdapterHelper.PresetLanguageIds[i]; if (!adapter.HasConfig(langId)) { if (currentWidth + buttonWidth > viewWidth) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Space(115f); currentWidth = 115f; } if (GUILayout.Button(CommonLanguageAdapterHelper.PresetLanguageNames[i], GUILayout.Width(60))) { Undo.RecordObject(adapter, "Add Language Config"); var newConfig = adapter.HasConfig(CommonLanguageAdapter.DefaultLangId) ? adapter.LanguageConfigs.Get(CommonLanguageAdapter.DefaultLangId).Clone() : new CommonLanguageConfigItem(); adapter.SetConfig(langId, newConfig); m_FoldoutStates[langId] = true; } currentWidth += buttonWidth; } } EditorGUILayout.EndHorizontal(); } }