151 lines
6.3 KiB
C#
151 lines
6.3 KiB
C#
/*
|
||
* @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();
|
||
}
|
||
}
|
||
} |