Unity TextMeshPro实现富文本超链接默认字体追加字体

下面是关于“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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 在C#里面给PPT文档添加注释的实现代码

    在C#中通过对PowerPoint对象模型的操作,可以实现在PPT文档中添加注释的功能。下面是具体的步骤: 1. 引用PowerPoint对象模型 首先需要引用PowerPoint对象模型,方法如下: using Microsoft.Office.Interop.PowerPoint; 2. 创建PowerPoint文档对象并打开文件 使用下面的代码可以创建…

    C# 2023年6月6日
    00
  • Win11 KB5012643造成 .Net 应用程序崩溃怎么办

    最近有用户反映,在安装了Windows 11 KB5012643更新后,运行.NET应用程序时会出现崩溃的情况。本文将提供解决方案,帮助用户解决这个问题。 问题描述 在安装了Windows 11 KB5012643更新后,运行.NET应用程序时会出现崩溃的情况。具体表现为,应用程序会在启动时崩溃,或者在使用某些功能时崩溃。 解决方案 方法一:卸载KB5012…

    C# 2023年5月15日
    00
  • C#实现自定义打印文字和图片的示例代码

    下面是“C#实现自定义打印文字和图片的示例代码”的完整攻略: 1. 准备工作 首先,你需要创建一个Windows窗口应用程序,可以使用Visual Studio来创建项目。程序中需要添加一个打印预览控件(PrintPreviewControl),用于显示要打印的内容预览。同时,也需要添加一个打印对话框(PrintDialog),用于打印设置和选择打印机。下面…

    C# 2023年6月1日
    00
  • C#验证身份证号码正确性的实例代码(收藏)

    我会详细讲解“C#验证身份证号码正确性的实例代码(收藏)”的完整攻略。 首先介绍一下身份证号码的规则,身份证号码是由18位数字和字母组成,其中最后一位可能是数字或字母‘X’,它的前17位是居民身份证编号的编排规则而定,分别代表不同的信息,其中第一位到第十七位表示所在地区,第十八位表示校验码。该校验码是身份证号码的最后一位,通过一定的算法计算得出。 接下来,我…

    C# 2023年6月1日
    00
  • .Net连接Oracle数据库的实现代码

    连接Oracle数据库的实现代码主要使用Oracle的官方.Net驱动程序来实现,下面是详细的实现攻略。 准备工作 下载安装Oracle的官方.Net驱动程序(Oracle.ManagedDataAccess.dll)。 在Visual Studio新建空项目,然后在NuGet Package Manager中安装Oracle.ManagedDataAcce…

    C# 2023年5月31日
    00
  • 详解C# winform ListView的基本操作

    详解C# WinForm ListView的基本操作攻略 介绍 C# WinForm中的ListView是一种非常常用的用于显示数据的控件,本攻略将详细讲解如何使用C# WinForm ListView实现基本操作,包括: ListView的基本属性设置 列表视图、图标视图、详情视图和小图标视图的展示方式 添加、删除和编辑ListView的项 ListVie…

    C# 2023年6月1日
    00
  • C#调用C++ DLL bool返回值始终为true的问题

    下面是详细的C#调用C++ DLL bool返回值始终为true的解决攻略: 问题描述 在C#调用C++ DLL的过程中,如果C++ DLL返回bool值,而在C#程序中bool返回值始终为true,这是因为bool在C++和C#中的实现方式有所不同,C++中的bool通常占用1个字节,而C#中的bool占用4个字节,在C#中bool类型值为0时,对应的是-…

    C# 2023年6月6日
    00
  • C# Clear():从集合中移除所有元素

    C#中的Clear()方法是一个实例方法,通常用于清空某些数据结构中的元素,例如字符串、数组、集合等。以下是C# Clear()的完整攻略,包括用法、示例和注意事项。 用法 Clear()方法是通过.运算符调用的实例方法,该方法不接受参数,返回值为void类型。可以使用Clear()方法来清空String、StringBuilder、List、Diction…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部