TH1/Unity/Assets/Scripts/TH1_Logic/Editor/MultilingualTextMonoEditor.cs

151 lines
6.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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/Resources/Export/Multilingual.asset";
Data = AssetDatabase.LoadAssetAtPath<MultilingualData>(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($"<b>绑定的字符串ID {mono.ID}</b>");
InspectorUtils.InspectorTextWidthRich($"<b>绑定的字体ID {mono.FontID}</b>");
EditorGUILayout.Space();
EditorGUILayout.Space();
EditorGUILayout.BeginVertical(_redBoxStyle);
OnGUICustomInfo();
EditorGUILayout.EndVertical();
}
private void OnGUICustomInfo()
{
// 获取目标组件实例
var mono = (MultilingualTextMono)target;
if (mono.ID == 0)
{
InspectorUtils.InspectorTextWidthRich($"<b>该组件暂未绑定任何ID,不允许做预览操作,否则数据存在丢失风险</b>");
return;
}
RefreshMultilingualData();
if (_previewId == 0) _previewId = mono.ID;
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>当前语言: {mono.PreviewType}</b>");
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>预览的ID </b>");
_previewId = (uint)EditorGUILayout.IntField((int)_previewId, GUILayout.Width(50));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>参数:</b>");
_param = EditorGUILayout.TextField(_param, GUILayout.Width(100));
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
InspectorUtils.InspectorTextWidthRich($"<b>预览的语言:</b>");
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<TextMeshProUGUI>();
textCom?.ForceMeshUpdate();
}
}
EditorGUILayout.EndHorizontal();
if (mono.GetMultiTextConfig(MultilingualType.ZH) == null)
{
InspectorUtils.InspectorTextWidthRich($"<b>缺少基础中文配置,请先生成基础配置</b>");
return;
}
EditorGUILayout.BeginHorizontal();
if (InspectorUtils.InspectorButtonWithTextWidth($"保存当前字体相关配置{mono.PreviewType}"))
{
var text = mono.GetComponent<TextMeshProUGUI>();
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<MultilingualType>();
foreach (var cfg in mono.TextCfg)
{
EditorGUILayout.BeginHorizontal();
if (cfg.Type != MultilingualType.ZH && InspectorUtils.InspectorButtonWithTextWidth($"x")) set.Add(cfg.Type);
InspectorUtils.InspectorTextWidthRich($"<b>字体配置{cfg.Type}</b>");
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();
}
}
}