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#实现winform用子窗体刷新父窗体及子窗体改变父窗体控件值的方法

    下面是完整攻略: 需求概述 我们需要实现以下两个需求: 在一个WinForm窗体中添加一个子窗体,并在子窗体中点击按钮刷新父窗体。 在子窗体中修改某个控件的值,使得父窗体中相应的控件的值也随之改变。 实现方法 刷新父窗体 为了方便演示,我们在父窗体中添加一个文本框和一个按钮,点击按钮会打开一个子窗体,子窗体中有一个按钮,用于刷新父窗体中的文本框。 在父窗体中…

    C# 2023年6月7日
    00
  • C#中LINQ to DataSet操作及DataTable与LINQ相互转换

    下面是详细讲解“C#中LINQ to DataSet操作及DataTable与LINQ相互转换”的完整攻略。 什么是LINQ to DataSet LINQ to DataSet是一组可嵌入到.NET语言中的代码库,使得我们可以在C#或VB.NET中使用LINQ查询DataSet或DataTable的数据。 如何进行LINQ to DataSet操作 我们可…

    C# 2023年5月15日
    00
  • 深入线程安全容器的实现方法

    深入线程安全容器的实现方法 什么是线程安全容器 线程安全容器(Thread-Safe Container)是一个能够同时被多个线程访问的数据结构。线程安全容器能够保证多个并发线程可以并且不会出现数据异常。线程安全容器应该在多线程环境下使用,以避免多个线程同时操作同一数据的问题。线程安全容器提供了一些并发访问数据结构的方法,如添加、删除、查找和更新等。 线程安…

    C# 2023年5月15日
    00
  • 基于AForge实现C#摄像头视频录制功能

    基于AForge实现C#摄像头视频录制功能攻略 1. 背景介绍 AForge是一款基于C#的开源机器视觉框架,支持多种图像处理和机器学习算法。除此之外,AForge还提供了许多常用的工具类,如IO、数字信号处理、多媒体等。本文将介绍如何使用AForge框架实现C#摄像头视频录制功能。 2. 实现步骤 2.1 引用AForge框架 在Visual Studio…

    C# 2023年6月3日
    00
  • c# 如何用组合替代继承

    组合和继承都是面向对象编程中的两个重要概念。在某些情况下,使用组合可以更好地设计我们的类和对象结构。下面是一些完整的攻略,说明如何使用组合来替代继承。 什么是继承(Inheritance)? 在面向对象编程中,继承是一种实现代码复用的方式。通过继承,子类可以从父类中继承属性和方法,从而可以减少代码冗余并增加可维护性。C# 中使用 : 符号来表示继承关系。 c…

    C# 2023年6月6日
    00
  • C#之字符串截取–Regex.Match使用

    C#之字符串截取–Regex.Match使用 在C#中,字符串截取是一项常见操作。Regex.Match()方法提供了一种强大的方式来根据正则表达式截取和匹配字符串。本文将介绍Regex.Match()方法的使用方法,包括声明、基本语法和两条示例说明。 声明 public static System.Text.RegularExpressions.Matc…

    C# 2023年6月6日
    00
  • asp.net(C#)遍历memcached缓存对象

    首先,我们需要了解一下什么是Memcached。Memcached是一种高速缓存系统,它可以将数据存储在内存中,以提高数据访问速度,可用于减轻关系数据库的压力。而ASP.NET(C#)是一种基于Web的开发技术,用于创建动态、数据驱动的网站和Web应用程序。在ASP.NET(C#)应用程序中使用Memcached缓存系统是一个不错的选择,可以提高应用程序的性…

    C# 2023年5月31日
    00
  • jQuery使用$.ajax进行即时验证实例详解

    让我来详细讲解“jQuery使用$.ajax进行即时验证实例详解”。 标题 首先,我们需要了解一下什么是jQuery以及$.ajax。jQuery是一个快速且简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画等操作。而$.ajax是jQuery中一个重要的函数,用来进行异步请求,可以实现无需刷新页面即可获取/修改数据。 具体步骤 在实现即…

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