using System.Collections.Generic; using UnityEditor; using UnityEngine; using UnityEngine.UI; [CustomEditor(typeof(ImageLanguageAdapter), true)] [CanEditMultipleObjects] public class ImageLanguageAdapterEditor : Editor { private Dictionary m_FoldoutStates = new Dictionary(); private void OnEnable() { ImageLanguageAdapterHelper.Initialize(); if (target is ImageLanguageAdapter adapter) { if (!adapter.HasConfig(ImageLanguageAdapter.DefaultLangId)) { adapter.ReadCurrentToConfig(ImageLanguageAdapter.DefaultLangId); EditorUtility.SetDirty(adapter); } foreach (var langId in adapter.GetConfiguredLanguages()) m_FoldoutStates.TryAdd(langId, false); } } public override void OnInspectorGUI() { var adapter = target as ImageLanguageAdapter; DrawBasicInfo(adapter); EditorGUILayout.Space(); DrawLanguageConfigs(adapter); if (GUI.changed) EditorUtility.SetDirty(target); } private void DrawBasicInfo(ImageLanguageAdapter adapter) { using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox)) { EditorGUILayout.LabelField("基本信息", EditorStyles.boldLabel); EditorGUI.BeginChangeCheck(); Component newTarget = (Component)EditorGUILayout.ObjectField("目标组件", adapter.TargetImageComponent, typeof(Component), true); ImageComponentType newType = (ImageComponentType)EditorGUILayout.EnumPopup("组件类型", adapter.TargetImageType); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(adapter, "Update Basic Info"); if (newTarget != null && newTarget != adapter.TargetImageComponent) { string typeName = newTarget.GetType().Name; if (typeName == "ImageEx") newType = ImageComponentType.ImageEx; else if (newTarget is Image) newType = ImageComponentType.Image; } adapter.TargetImageComponent = newTarget; adapter.TargetImageType = newType; } EditorGUILayout.HelpBox("请手动拖拽要适配的图片组件,并确认组件类型是否正确。", MessageType.Info); } } private void DrawLanguageConfigs(ImageLanguageAdapter 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(ImageLanguageAdapter adapter, string langId) { m_FoldoutStates.TryAdd(langId, false); int presetIndex = System.Array.IndexOf(ImageLanguageAdapterHelper.PresetLanguageIds, langId); string name = presetIndex >= 0 ? ImageLanguageAdapterHelper.PresetLanguageNames[presetIndex] : ImageLanguageAdapter.GetLanguageShowName(langId); string label = string.IsNullOrEmpty(name) ? langId : $"{langId} ({name})"; EditorGUI.indentLevel++; if (langId == ImageLanguageAdapter.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(ImageLanguageConfigItem 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("Image 配置", EditorStyles.miniBoldLabel); cfg.enabled = EditorGUILayout.Toggle("显示", cfg.enabled); cfg.color = EditorGUILayout.ColorField("Color", cfg.color); cfg.type = (Image.Type)EditorGUILayout.EnumPopup("Type", cfg.type); if (cfg.type == Image.Type.Sliced || cfg.type == Image.Type.Tiled) { cfg.fillCenter = EditorGUILayout.Toggle("Fill Center", cfg.fillCenter); } if (cfg.type == Image.Type.Filled) { cfg.fillMethod = (Image.FillMethod)EditorGUILayout.EnumPopup("Fill Method", cfg.fillMethod); cfg.fillAmount = EditorGUILayout.Slider("Fill Amount", cfg.fillAmount, 0f, 1f); cfg.fillOrigin = EditorGUILayout.IntField("Fill Origin", cfg.fillOrigin); } cfg.preserveAspect = EditorGUILayout.Toggle("Preserve Aspect", cfg.preserveAspect); cfg.useSpriteMesh = EditorGUILayout.Toggle("Use Sprite Mesh", cfg.useSpriteMesh); cfg.pixelsPerUnitMultiplier = EditorGUILayout.FloatField("Pixels Per Unit Multiplier", cfg.pixelsPerUnitMultiplier); if (EditorGUI.EndChangeCheck()) EditorUtility.SetDirty(target); } private void DrawConfigItemActions(ImageLanguageAdapter 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 == ImageLanguageAdapter.DefaultLangId)) { if (GUILayout.Button("删除", GUILayout.Width(50))) { Undo.RecordObject(adapter, "Remove Config"); adapter.RemoveConfig(langId); m_FoldoutStates.Remove(langId); } } } } private void DrawAddLanguageConfig(ImageLanguageAdapter 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 < ImageLanguageAdapterHelper.PresetLanguageIds.Length; i++) { string langId = ImageLanguageAdapterHelper.PresetLanguageIds[i]; if (!adapter.HasConfig(langId)) { if (currentWidth + buttonWidth > viewWidth) { EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Space(115f); currentWidth = 115f; } if (GUILayout.Button(ImageLanguageAdapterHelper.PresetLanguageNames[i], GUILayout.Width(60))) { Undo.RecordObject(adapter, "Add Language Config"); var newConfig = adapter.HasConfig(ImageLanguageAdapter.DefaultLangId) ? adapter.LanguageConfigs.Get(ImageLanguageAdapter.DefaultLangId).Clone() : new ImageLanguageConfigItem(); adapter.SetConfig(langId, newConfig); m_FoldoutStates[langId] = true; } currentWidth += buttonWidth; } } EditorGUILayout.EndHorizontal(); } }