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#正则表达式匹配HTML中的图片路径,图片地址代码

    针对“C#正则表达式匹配HTML中的图片路径,图片地址代码”的问题,以下是完整攻略: 前言 在很多网站中,图片的路径都是通过HTML代码进行定义和获取。而在使用C#开发的网站中,我们可能需要通过正则表达式提取HTML中的图片路径,以便我们可以预览或下载图片。 操作步骤 第一步:获取HTML代码 首先,我们需要获取HTML代码,一种常用的方法是使用HttpWe…

    C# 2023年6月7日
    00
  • 拦截asp.net输出流并进行处理的方法

    拦截asp.net输出流并进行处理的方法可以通过实现自定义的HttpModule来实现。下面将详细介绍具体的步骤和示例。 第一步:创建自定义HttpModule类 首先,我们需要创建一个自定义的HttpModule类,并实现其核心方法Application_EndRequest。该方法会在每个请求结束后被调用,并且此时应用程序将已处理完整个请求,即可以读写请…

    C# 2023年6月3日
    00
  • C#控制台基础 List泛型集合与对应的数组相互转换实现代码

    下面是C#控制台基础 List泛型集合与对应的数组相互转换实现代码的完整攻略。 一、List泛型集合与数组的区别 List泛型集合和数组都可以用来存储一组数据,但二者在使用上有些许不同。主要区别如下: 数组的长度是固定的,一旦定义了长度就无法再改变;而List泛型集合的长度是可变的,可以随时添加或删除元素。 数组的元素只能是一种数据类型,而List泛型集合可…

    C# 2023年6月1日
    00
  • ASP.NET Core基础之Main方法讲解

    ASP.NET Core基础之Main方法讲解 在 ASP.NET Core 中,Main 方法是应用程序的入口点。在本攻略中,我们将介绍 ASP.NET Core 中 Main 方法的用法,包括如何配置应用程序和如何运行应用程序。以下是 ASP.NET Core 基础之 Main 方法讲解的完整攻略: 步骤一:创建 ASP.NET Core 应用程序 首先…

    C# 2023年5月17日
    00
  • C# 单元测试全解析

    C# 单元测试全解析 前言 单元测试在软件开发过程中是一个至关重要的环节,可以确保代码的质量与正确性。而C#作为一种强类型编程语言,提供了方便易用的单元测试框架。本文将全面讲解C#中的单元测试包括:单元测试框架的介绍、搭建单元测试环境、编写单元测试用例、运行单元测试。希望本文能够对C#单元测试的学习与实践有所帮助。 单元测试框架介绍 单元测试框架是C#中用于…

    C# 2023年5月31日
    00
  • 关于C#基础知识回顾–反射(三)

    关于C#基础知识回顾–反射(三)这篇文章的完整攻略如下: 一、反射简介 1.1 反射的概念 反射(Reflection)是指在程序运行的时候访问、检测和修改程序集中的元数据和对象的方式。反射用于访问 .NET 中的元数据,这种元数据描述了程序集(assembly)、模块(module)和类型(type)等。通过元数据,我们可以获取类型信息,了解类的结构和成…

    C# 2023年6月1日
    00
  • .Net Core WebApi的简单创建以及使用方法

    创建和使用.NET Core Web API是一种构建RESTful Web服务的常见方法。本文将详细讲解.NET Core Web API的简单创建以及使用方法,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始实现.NET Core Web API之前,我们需要先搭建好开发环境。具体来说,我们需要安装以下软件: Visual Studio 2019或…

    C# 2023年5月16日
    00
  • C#代码实现扑克牌排序的几种方式

    C#代码实现扑克牌排序的几种方式 1. 排序算法简介 排序算法是计算机程序设计中重要的算法之一,其目的是把一组无序的数据按照一定的顺序排列。排序算法在许多领域中都有广泛的应用,如在数据库中对数据进行排序,对数据结构中的元素进行排序等。 目前常用的排序算法有插入排序、冒泡排序、选择排序、快速排序、归并排序等。其中,插入排序、冒泡排序、选择排序是比较基础和简单的…

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