Unity显示泰语且兼容泰语音标

前言:使用Unity开发的游戏需要支持泰语本地化,以及解决显示泰语时Unity的bug

现在很多游戏都需要显示泰语,下面将介绍Unity如何显示泰语,(仅介绍Unity字体方面的设置步骤以及Unity在显示泰语时的bug和解决方案,具体游戏里面如何切换语言不做过多介绍)

Unity里面显示文本的组件主要有下面几个:

  • Text组件
  • TextMesh组件(不介绍)
  • TextMeshPro组件

TextMesh组件的解决方案和Text组件类似,所以不做介绍。本文章中所有提到的资源文件在文末的链接下载。

1、Text组件显示泰语

首先需要找到一套能支持泰语的字体,这里推荐Tahoma.ttf字体,当我们拿到这套字体之后,在Unity里面试试效果。

额。。。看起来很完美,文字都是正常显示的。但是这个音标和泰语的字符中间怎么有这么大的间隙呢?那是因为Unity字体渲染器缺乏对 GPOS 和 GSUB 的支持。因为泰语字体很大程度上依赖于这些功能,所以如果没有它们,渲染的图像看起来很难看。而且对于泰国人来说这样的文字不方便阅读。
在这里插入图片描述
我们将文字复制到其他软件中看看效果:
在这里插入图片描述
可以看到在其他软件中泰语的音标和字符之间没有任何间隙,这样看起来就舒服多了。接下来介绍如何在Unity里面实现类似效果。

对于Text组件显示泰语需要用ThaiFontUtility.Adjust接口在复制之前进行转换一下。在执行一下代码之后泰语音标就正常了。

    private void Update()
    {
        text.text = ThaiFontUtility.Adjust("กิจกรรมเช็กอินฤดูใบไม้ร่วงสิ้นสุดแล้ว ระบบตรวจพบว่าคุณมีรางวัลล็อกอินที่ยังไม่ได้รับและได้ส่งทางจดหมายแล้ว กรุณาตรวจรับ");
    }

在这里插入图片描述
调用这个接口的时机也可以放到Text组件里面给text赋值的时候
在这里插入图片描述
注意:
ThaiFontAdjuster 只能处理特殊字体。这种字体需要具备从 U+F700 到 U+F71A 的扩展字形,从而提供泰语字符的各种位置。这也就是为什么之前推荐使用Tahoma.ttf字体了。

原理:
其实原理就是将原本的字符替换为其他字符,被替换的字符含义不变,只是相对位置变了而已。替换规则如下:

    // ========== EXTENDED CHARACTER TABLE ==========
    // F700:     uni0E10.descless    (base.descless)
    // F701~04:  uni0E34~37.left     (upper.left)
    // F705~09:  uni0E48~4C.lowleft  (top.lowleft)
    // F70A~0E:  uni0E48~4C.low      (top.low)
    // F70F:     uni0E0D.descless    (base.descless)
    // F710~12:  uni0E31,4D,47.left  (upper.left)
    // F713~17:  uni0E48~4C.left     (top.left)
    // F718~1A:  uni0E38~3A.low      (lower.low)
    // ==============================================
    // [base]             [top] -> [base]             [top.low]
    // [base]     [lower] [top] -> [base]     [lower] [top.low]
    // [base.asc]         [top] -> [base.asc]         [top.lowleft]
    // [base.asc] [lower] [top] -> [base.asc] [lower] [top.lowleft]


2、TextMeshPro组件显示泰语

第一步需要创建一套泰语的SDF字体,这里使用AlibabaSansThaiMedium.ttf字体(任意字体均可,无硬性要求),右键该字体 ->Create->TextMeshPro->FontAsset。
在这里插入图片描述
然后选中改字体点击【Update Atlas Texture】
在这里插入图片描述
按照下面的示意图进行设置
在这里插入图片描述
其中蓝色方框内的内容填入下面这个:

③CНฉ์3v≧ü#fрฬVаผ以FРฌ6y฿&(iуฯYгฟ【I…ฏⅡ 9|~Бโ)lา\□•ย	Lฒ④Ⅴ<⑥ข❦,oี_йล“O⑤ต?м่/한ุ!b¥ГศRธB어Мзจ๋ωuя≦"ếeใหUปEПซ5%hтฮXвพH《2ฎⅠู8{(kñั[еá—KฑⅣ。;~กไr+nิиäฤNด>◆ค็.qыืaлçวQ×ท①สAЛง๊1t·≥!dюо”Tบ》Dชํ4wД$gсíอWฝGСญ7zเ')jะZภ】J②ฐⅢ、:}*,mệóำ] ร
MЧณ=?ฃๆ-pึк’
Pมถ@ฆ้0s≤ ‘cнéษSน

这一套操作下来就可以发现现在TextMeshPro组件现在就可以显示泰语字体了。
在这里插入图片描述
但是,是不是发现了这个位置有点不正常,这里有两个字符重叠了(可以对照上面的Text组件的显示效果)。下面来解决TMP组件显示泰语音标重叠的问题。


解决这个问题也简单,使用AdjustWannayuk工具设置一下音标表的偏移值就行。
在这里插入图片描述
右键SDF的字体文件选择AdjustWannayuk命令,然后就设置好了。这个时候就正常了,而且不需要调用ThaiFontUtility.Adjust接口,音标的位置也是正确的。
在这里插入图片描述
工具以及字体资源的下载地址:
https://github.com/momohola/Unity-Thai-Adjust

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值