/* * @Author: 白哉 * @Description: * @Date: 2025年07月21日 星期一 20:07:12 * @Modify: */ using System.Collections.Generic; using Logic.Multilingual; using TMPro; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; namespace Logic.Editor { [CustomEditor(typeof(MultilingualTextMono))] public class MultilingualTextMonoEditor : UnityEditor.Editor { public static MultilingualData Data; private uint _previewId = 0; private string _param = ""; private GUIStyle _redBoxStyle; public void RefreshMultilingualData() { if (Data != null) return; var path = $"Assets/BundleResources/Export/Multilingual.asset"; Data = AssetDatabase.LoadAssetAtPath(path); } public override void OnInspectorGUI() { if (_redBoxStyle == null) { _redBoxStyle = InspectorUtils.GetHelpBoxStyle(); InspectorUtils.AddBorder(_redBoxStyle, new Color(0.5f, 0.4f, 0.4f, 0.6f)); } DrawDefaultInspector(); // 显示默认属性 var mono = (MultilingualTextMono)target; InspectorUtils.InspectorTextWidthRich($"绑定的字符串ID: {mono.ID}"); InspectorUtils.InspectorTextWidthRich($"绑定的字体ID: {mono.FontID}"); EditorGUILayout.Space(); EditorGUILayout.Space(); EditorGUILayout.BeginVertical(_redBoxStyle); OnGUICustomInfo(); EditorGUILayout.EndVertical(); } private void OnGUICustomInfo() { // 获取目标组件实例 var mono = (MultilingualTextMono)target; if (mono.ID == 0) { InspectorUtils.InspectorTextWidthRich($"该组件暂未绑定任何ID,不允许做预览操作,否则数据存在丢失风险"); return; } RefreshMultilingualData(); if (_previewId == 0) _previewId = mono.ID; EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"当前语言: {mono.PreviewType}"); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"预览的ID: "); _previewId = (uint)EditorGUILayout.IntField((int)_previewId, GUILayout.Width(50)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"参数:"); _param = EditorGUILayout.TextField(_param, GUILayout.Width(100)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); InspectorUtils.InspectorTextWidthRich($"预览的语言:"); for (int i = (int)MultilingualType.ZH; i <= (int)MultilingualType.KR; i++) { if (InspectorUtils.InspectorButtonWithTextWidth($"{(MultilingualType)i}")) { var text = Data.GetMultilingualStr(_previewId, (MultilingualType)i); var font = Data.GetMultilingualFont(mono.FontID, (MultilingualType)i); if (!string.IsNullOrEmpty(_param)) text = text.Replace("{param}", _param); mono.SetMultilingualText(text, (MultilingualType)i, font); mono.PreviewType = (MultilingualType)i; var textCom = mono.GetComponent(); textCom?.ForceMeshUpdate(); } } EditorGUILayout.EndHorizontal(); if (mono.GetMultiTextConfig(MultilingualType.ZH) == null) { InspectorUtils.InspectorTextWidthRich($"缺少基础中文配置,请先生成基础配置"); return; } EditorGUILayout.BeginHorizontal(); if (InspectorUtils.InspectorButtonWithTextWidth($"保存当前字体相关配置{mono.PreviewType}")) { var text = mono.GetComponent(); if (text) { for (int i = mono.TextCfg.Count - 1; i >= 0; i--) { if (mono.TextCfg[i].Type == mono.PreviewType) mono.TextCfg.RemoveAt(i); } var cfg = new MultiTextConfig(text, mono.PreviewType); mono.TextCfg.Add(cfg); // 按Type从小到大排序 mono.TextCfg.Sort((a, b) => a.Type.CompareTo(b.Type)); } EditorUtility.SetDirty(mono); PrefabUtility.RecordPrefabInstancePropertyModifications(mono); EditorSceneManager.MarkSceneDirty(mono.gameObject.scene); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginVertical(EditorStyles.helpBox); var set = new HashSet(); foreach (var cfg in mono.TextCfg) { EditorGUILayout.BeginHorizontal(); if (cfg.Type != MultilingualType.ZH && InspectorUtils.InspectorButtonWithTextWidth($"x")) set.Add(cfg.Type); InspectorUtils.InspectorTextWidthRich($"字体配置{cfg.Type}:"); InspectorUtils.InspectorTextWidthRich($"Size: {cfg.FontSize}"); InspectorUtils.InspectorTextWidthRich($"CharacterSpacing: {cfg.CharacterSpacing}"); InspectorUtils.InspectorTextWidthRich($"WordSpacing: {cfg.WordSpacing}"); InspectorUtils.InspectorTextWidthRich($"LineSpacing: {cfg.LineSpacing}"); InspectorUtils.InspectorTextWidthRich($"ParagraphSpacing: {cfg.ParagraphSpacing}"); EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); } for (int i = mono.TextCfg.Count - 1; i >= 0; i--) { if (set.Contains(mono.TextCfg[i].Type)) mono.TextCfg.RemoveAt(i); } EditorGUILayout.EndVertical(); } } }