下面是关于“Unity TextMeshPro 实现富文本超链接默认字体追加字体”的完整攻略:
背景介绍
在 Unity 项目中,TextMeshPro 是一款很常用的文本 UI 组件。它支持富文本、超链接、字体嵌入等功能,并且相比 Unity 自带的 Text 组件,TextMeshPro 更加易用、性能更好。我们在项目中经常需要使用到富文本超链接,但默认情况下,超链接中的字体只能使用 TextMeshPro 预设选中的默认字体。如果我们需要使用其他字体来显示超链接中的文本该怎么做呢?
解决方法
利用 TextMeshPro 支持的 TMP_FontAsset 属性来实现。TMP_FontAsset 是一种字体文件类型,我们可以在 Inspector 界面中将它设置给 TextMeshPro 的 TMP_Text 组件,从而更改文本的字体。那么如何将这个属性和超链接结合起来呢?这里给出一个示例:
示例一
using TMPro;
using UnityEngine;
public class RichTextWithLinkTest : MonoBehaviour
{
public TMP_Text text;
// 调用这个方法来更改超链接中的字体
private void SetLinkFont(string linkID, TMP_FontAsset fontAsset)
{
TMP_LinkInfo[] linkInfos = text.textInfo.linkInfo;
foreach (TMP_LinkInfo linkInfo in linkInfos)
{
if (linkInfo.GetLinkID().Equals(linkID))
{
linkInfo.textComponent.font = fontAsset;
text.UpdateVertexData(TMP_VertexDataUpdateFlags.All);
break;
}
}
}
private void Start()
{
string richText = "这是<a=\"MyLinkID\">一段超链接</a>。";
text.text = richText;
TMP_LinkInfo[] linkInfos = text.textInfo.linkInfo;
foreach (TMP_LinkInfo linkInfo in linkInfos)
{
string linkID = linkInfo.GetLinkID();
linkInfo.linkText = "点我更改字体";
linkInfo.SetLinkID("ChangeFont_" + linkID);
linkInfo.linkColor = Color.blue;
}
}
// 点击超链接时调用这个方法,更改字体为指定字体
public void OnLinkClicked(string linkID)
{
if (linkID.StartsWith("ChangeFont_"))
{
TMP_FontAsset fontAsset = Resources.Load<TMP_FontAsset>("Fonts/NewFont");
SetLinkFont(linkID.Substring(11), fontAsset);
}
}
}
在这个示例中,我们通过一个 SetLinkFont 方法来实现更改超链接中文本字体的操作。首先要知道,每个超链接在 TextMeshPro 组件中都会生成一条 TMP_LinkInfo 数据,这个数据包含了超链接的相关信息。我们可以通过调用 text.textInfo.linkInfo 获取所有链接数据,然后在其中查找指定的链接(这里使用 GetLinkID 方法获取链接的 ID),找到后将文本字体更改为指定字体,再调用 text.UpdateVertexData 方法来更新文本顶点数据。这样,文本就会使用新字体重新渲染。
示例二
如果你需要在 TextMeshPro 中设置多个字体,而不只是默认字体和一种指定字体,可以使用 TMP_FontAsset 的另一个属性:fallbackFontAssets。这个属性是一个字体文件数组,可以根据需要将多个字体文件设置给它。当文本中使用的字体不能在当前项目中找到时,TextMeshPro 会按照 fallbackFontAssets 中设置字体的顺序依次尝试使用这些字体,直到找到合适的字体为止。下面给出一个在 TextMeshPro 中使用多个字体的示例:
using TMPro;
using UnityEngine;
public class MultiFontTest : MonoBehaviour
{
public TMP_Text text;
public TMP_FontAsset defaultFont;
public TMP_FontAsset[] otherFonts;
private void Awake()
{
// 设置一个回调函数,当 TextMeshPro 无法找到指定字体时,使用回调中返回的字体
text.fontFallbackLookup.AddListener(OnFontFallbackLookup);
}
private void OnFontFallbackLookup(TMP_FontAsset currentFontAsset, int characterIndex, TMP_FontAsset[] fontAssetStack)
{
// 如果之前已经设置过回调,这里要先清空 fontAssetStack 数组,否则之前设置的字体将会继续被使用
fontAssetStack[0] = null;
fontAssetStack[1] = null;
// 模拟选择使用其他字体的场景,将当前文本字符的 index 设定为 5
if (characterIndex >= 5)
{
fontAssetStack[0] = otherFonts[0];
fontAssetStack[1] = otherFonts[1];
}
}
private void Start()
{
string richText = "这是一段<a=\"MyLinkID\">富文本,</a>其中有部分 <b>使用了</b> 其他字体。";
text.text = richText;
TMP_LinkInfo[] linkInfos = text.textInfo.linkInfo;
foreach (TMP_LinkInfo linkInfo in linkInfos)
{
linkInfo.linkColor = Color.blue;
}
}
}
在这个示例中,我们在 TextMeshPro 的 Inspector 界面中设置了一个默认字体 defaultFont,并将 fallbackFontAssets 属性设置为另外两个字体。当后面的文本需要切换字体时,需要在 OnFontFallbackLookup 回调函数中设置 fontAssetStack 数组中的元素,以决定使用哪些字体。在 Start 方法中遍历了所有链接信息,并将链接文本的颜色修改为蓝色,显示为超链接。
总结
TextMeshPro 是一个非常强大的文本组件,支持多种文本效果和富文本操作。在处理超链接文本的时候,我们可以借助它的 TMP_FontAsset 属性来实现更改超链接中文本字体的操作。另外,我们也可以利用 fallbackFontAssets 属来设置多个字体,可以灵活地根据需求进行字体切换,为项目中的文本效果提供更多的选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Unity TextMeshPro实现富文本超链接默认字体追加字体 - Python技术站