【Unity】UGUI新版TMP和旧版Text组件的适配器
2017年Unity就已经收购并内置了文本插件TextMeshPro,简称TMP。可是还有大部分遗留项目广泛依赖原本的Text组件,为了能让旧有项目适配使用TMP,不得不做一些适配工作。
从Unity的官方手册上可以看到,TMP是官方公认Text组件的完美替代,如果使用较新版本的Unity,可以发现旧版Text已经被归类为遗产。旧版Text的另一种说法也就是Legacy Text,因此它大概率会被慢慢弃用,不会有后续的更新维护了。
不过至少就目前而言,真实工作时还是会遇到很多无法或不愿弃用旧版Text组件的情况,这时候一个简单的适配逻辑就有了作用。
重写部分实际很少,大部分是旧版Text源码。
TextAdapterTMP.cs 代码如下:
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class TextAdapterTMP : Text
{
// 注意区分 TextMeshPro 和 TextMeshProUGUI
[SerializeField] private TextMeshProUGUI _textShow;
public override string text
{
get
{
return m_Text;
}
set
{
if(string.IsNullOrEmpty(value))
{
if (string.IsNullOrEmpty(m_Text))
return;
m_Text = "";
SetVerticesDirty();
}
else if(m_Text != value)
{
m_Text = value;
SetVerticesDirty();
SetLayoutDirty();
// 只重写了一个赋值
_textShow.text = value;
}
}
}
// 增加几个生命周期的及时响应,
// 实际没什么应用情景,
// 现有问题无法完美解决
protected override void Awake()
{
base.Awake();
HideOldShowNew();
}
protected override void OnEnable()
{
base.OnEnable();
HideOldShowNew();
}
protected override void Start()
{
base.Start();
HideOldShowNew();
}
// 隐藏旧版Text显示,新版TMP文本赋值
private void HideOldShowNew()
{
_textShow.text = text;
color = Color.clear;
}
// 测试一下逻辑是否正确
private void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
text = "测试<sprite=0>测试<sprite=1>一二三四五<sprite=5>";
}
}
}
另外,旧版 Text 的 Inspector 逻辑也被封死在一个 TextEditor 类中,需要在 Editor 文件夹下创建 TextAdapterTMP_Editor.cs。重写部分编辑器逻辑才能在 Inspector 中便利地拖动绑定 TMP 对象。代码如下:
using UnityEditor;
[CustomEditor(typeof(TextAdapterTMP), true)]
[CanEditMultipleObjects]
public class TextAdapterTMP_Editor : UnityEditor.UI.TextEditor
{
private SerializedProperty _textShow;
// TextEditor 和 UnityEditor.UI.TextEditor 是两个类,要注意区分
// 如果没有可重写的方法,注意检查是否继承了错误的 TextEditor 类
protected override void OnEnable()
{
base.OnEnable();
_textShow = serializedObject.FindProperty("_textShow");
}
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
EditorGUILayout.Space();
serializedObject.Update();
EditorGUILayout.PropertyField(_textShow);
serializedObject.ApplyModifiedProperties();
}
}
能够使用 TMP 的话,很多 Text 的坑就都可以避免了。类似图文混排等功能也变得极易实现。
更优的方案,当然还是更新底层逻辑支持TMP,虽然很多时候,这并不现实。最后记录两篇 TMP 的使用参考:
[参考文档] https://zhuanlan.zhihu.com/p/457041220
[参考文档] https://zhuanlan.zhihu.com/p/458678835