Unity アラビア語適応 (アルティメット エディション)

私は最近アラビア語の適応に取り組んでいますが、インターネット上に完全な解決策がないことがわかりました。今回は完全な解決策とスケーラブルなコードのセットをお届けします。将来、私たち一人一人が再びそれに遭遇することを願っています。アラビア語に適応するには、この究極のソリューションを使用できます。同時に、Unity のアップデートにより、TextMeshPro を使用するプロジェクト チームがますます増えています。この記事で提供されるソリューションは、UGUI と TextmeshPro の両方をサポートし、unity2018 以降から正常に適用できます。これより前のバージョンはテストしていません。

アラビア語の翻案で最も難しいのは、結果が正しいか間違っているかがわからないことですが、私がそれを行ったときは、百度翻訳を参照するだけで、最終的にアラビア語を理解できる人を見つけて校正してもらいました。記事の後半では、アラビア語の表示を自分で判断する簡単な方法を説明します。

アラビア語入門

   1.首先我们要来对阿文有一个基本的认知。阿文的显示是从右往左,右对齐。这里要注意,不只是顺序从右往左,每一个字符,也都是从右往左显示。
             原文:"ABCD EFG"   (斜体表示原始顺序)
             阿文:"GFE DCBA"   (非斜体表示正确顺序)
   2.阿拉伯语属闪含语系闪米特语族,是由28个辅音字母和12个发音符号(不包括叠音符)组成的拼音文字。书写顺序从右往左横行书写,翻阅顺序也是由右往左。阿拉伯语字母无大、小写之分,但有印刷体、手写体和艺术体之别。书写时,每个字母均有单写与连写之分。
        下图为部分辅音字母,简单点说, 28个辅音字母中的每一个都有4个字形,用于根据字母在初始,中间,最终或隔离中的位置来表示字母。(说白了就是,一个字母右4种写法,根据你的位置来决定怎么写,在适配的时候,你会看到一个字符串翻转过来以后,长得完全不一样)
   3.tashkeel(元音)
        元音我理解就像我们汉字里的拼音,一般来说,是不需要显示元音的。通常在《古兰经》、幼儿读物、阿语学习教材,或者给外国人阅读的书籍中才加元音符号。
        一个最简单的看法就是,你发现你的阿文里,上下有点点之类的时候,就表示他显示了元音
        大部分情况下,不需要显示原音
   4.数字的问题
        虽然我们日常使用的是数字叫阿拉伯数字,比如1234567890,但是实际上阿拉伯数字最初由古印度人发明,再由阿拉伯人传向欧洲,欧洲再将其现代化,人们误以为是阿拉伯人发明,所以称之为阿拉伯数
        字。实际上阿语中,有一套自己的数字系统,而且不止一套。我们在做阿语适配的时候,会将数值统一改为我们印象中的阿拉伯数字(1234567890),而不用阿拉伯文里数字。
        阿拉伯文的数值依然使用从左到右显示                                                             
   5.和英文,数字等混排的时候,英文和数值依然使用从左到右的顺序
        原文:"ABCD  hello 123  EFG"   (斜体表示原始顺序)
        阿文:"GFE 123  hello DCBA"   (非斜体表示正确顺序)
     以上5种,都是阿语语法和显示顺序的关系,网上有一个免费的插件
     也是应用范围最广的一个插件 [https://github.com/Konash/arabic-support-unity](https://github.com/Konash/arabic-support-unity)
     该插件使用简单,一句话就可以搞定
     string result = ArabicFixer.Fix(text, false, false);         

上記をインターネットで検索することもできますが、プロジェクトで使用するのは決して簡単ではありません。
このコントロールはアラビア文字の変換のみを担当します。リッチ テキスト、行の折り返し、および混合配置にはいくつかの問題があります。
彼の質問を見てみましょう
1. 行の折り返し
2. リッチ テキスト タグ
3. 英語とアラビア語の混合
これら 3 つの状況は上記のプラグインではサポートされていないため、プラグインを変更する必要があります。各プロジェクト チームはそれぞれの理解に多少の変更を加えますが、統一された解決策を持っている人はいません。ここで私の解決策を紹介します。

ここでは、ArabicSupport プラグインを使用しませんでしたが、RTL TextMeshPro ソリューションhttps://github.com/pnarimani/RTLTMProを使用しました。このソリューションは、リッチ テキスト タグなどの効果を処理し、作業の重複を避けるのに役立ちました。このソリューションを使用して、その適応効果を UGUI に移植します。

準備

  1. Unicode コードに従ったクエリ文字
    https://symbl.cc/cn/

  2. Unicode 文字ライブラリ
    https://www.fuhaoku.net/blocks

  3. RTL TextMeshPro
    https://github.com/pnarimani/RTLTMPro

  4. アラビア語の実際の正しい順序を確認してください。Word
    ソフトウェアをインストールしてください。WPS は使用しないでください。WPS は使用しないでください。Wordソフトウェアは、アラビア語が実際にどのようなものであるかを確認するために便宜的に使用されています。Word を
    開いて、アラビア語の文章をコピーし、次に、貼り付けオプションで「」を選択します。テキストのみを保持します。」次に、「段落->右から左へのテキストの方向」を選択します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

    この状態では、表示されているアラビア語が真に正しいアラビア語です。
    重要なことを 3 回言います。デバッグ中や、メモ帳や IDE で文字列が表示されたとき、実際に実行するときは、信じないでください。必ずしも表示されている順序とは限りません。
    IDE、デバッガー、または一部のメモ帳プログラムはすべて独自にアラビア語を変換しますが、変換結果は正しくない可能性があります。

  5. 文字列の Unicode コードを出力するツール関数を作成し、 Web サイトhttps://symbl.cc/cn/を使用してUnicode コードに基づいて対応する文字をクエリし、実際の順序を確認します。

public void PrintArabicUnicode(string text)
{
    
    
    StringBuilder sb=new StringBuilder();
    for (int i=0;i<text.Length;i++)
    {
    
    
        int unicode32CodePoint = char.ConvertToUtf32(text, i);
        sb.Append(unicode32CodePoint+" ");
    }
    Debug.Log(sb.ToString());
}
//注意在这个文档里,阿语的显示顺序已经发生变化了,其实我使用的还是上面的字符串
//string se = "name_new_group_hint=اسم المجموعة (مطلوب)";
//PrintArabicUnicode(se);
//输出结果
//110 97 109 101 95 110 101 119 95 103 114 111 117 112 95 104 105 110 116 61 1575 1587 1605 32 1575 1604 1605 1580 1605 1608 1593 1577 32 40 1605 1591 1604 1608 1576 41
比如说110,对应英文字母n

ここに画像の説明を挿入します

TextMeshPro を適応させる方法

私はUnity2018.4を使用しています, TextMeshPro (TMP) バージョンは1.4.1, このバージョンは少し古いですが、より高度なバージョンのUnityとTMPを使用している場合は、それも使用できます. TMPをインストールした後、RTL TextMeshProをダウンロードし
ます

  1. ダウンロード ページhttps://github.com/pnarimani/RTLTMPro/releasesを開き、v3.4.3.unitypackageをダウンロードして、プロジェクトにインポートします。
    ここに画像の説明を挿入します

  2. TMP ソース コードを変更します。TMP
    2.1 より上のバージョンの場合、この手順は必要ありません。手順 3 だけを実行してください。2.1
    より前のバージョンの場合、ソース コードを変更する必要があります。以下はTMPのソースコードの修正方法の紹介であり、
    プラグインが提供する公式の修正方法となります。
    ここに画像の説明を挿入します

    理解できない場合は、以下の手順に従って修正してください。

  3. まず Unity を閉じ、Libray/PackageCache で TMP ソース コードを見つけて、フォルダー全体を Packages ディレクトリにコピーします。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

  4. TMP_Text ファイルを見つけて、仮想キーワードをテキスト フィールドに追加してから、RTLTextMeshPro.cs ファイルを開いて、オーバーライド キーワードをテキスト フィールドに追加します。
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

  5. RTLTMPro を使用した
    フォルダー全体のディレクトリは次のとおりです。Scene にはテスト デモが多数あります。ご覧ください。実際の使用では、プロジェクト リソースを節約するために、Scripts ディレクトリのみを保持し、他のディレクトリは削除できます。 -クリックしてメニューを使用すると、
    ここに画像の説明を挿入します
    多くの Text-RTLTMP オプションが利用可能になりました。
    すべての TextMeshProUGUI スクリプトを RTL TextMeshPro に置き換えます。
    アラビア語を必要とするすべてのテキスト コントロールは、RTL TextMeshPro に置き換えられます。
    ここに画像の説明を挿入しますここに画像の説明を挿入します
    ここに画像の説明を挿入します

  6. RTL TextMeshPro について説明すると、ネイティブ TextMeshPro と比較してフィールドが 4 つ増えています。

  • ペルシア語: チェックすると英語の数字がペルシア語の数字になりますが、通常はチェックする必要はありません。
  • ForceFix: このフィールドは非常に重要です。アラビア語と英語が混在している場合、英語の文字が文の先頭にある場合、その文は英語として扱われることがよくあります。この場合、このオプションをチェックすると、アラビア語と英語の使用を強制できます。アラビア語。処理する単語
  • 数字を保持
    : チェックを入れると、アラビア数字は 123456789 の形式で表示されます。 チェックすることをお勧めします (特定の理由については、上記を参照してください。 アラビア語には独自の数字の形式があります。 の形式で数字を表示したい場合は、 123456789、確認する必要があります。)
  • FixTags: チェックすると、TMP リッチ テキスト タグがサポートされます。

7. 実際の推奨使用方法

ステップ6は公式に推奨されている使い方ですが、実際のアプリケーションではまだ不便な点があることが分かりました、例えば強制修正のチェックがスマートではない、上記4つのオプションを毎回選択する必要があります。あまり賢くないので、以下で話しましょう。新しいスクリプトを使用して TextMeshProUGUI を継承し、すべてのテキストが FinalText を使用するようにするにはどうすればよいですか? FinalText は、文字列に Awen が含まれているかどうかを判断します。Awen が含まれている場合は、自動的に修復スクリプトを呼び出して処理します。それ。

using System.Collections;
using System.Collections.Generic;
using RTLTMPro;
using TMPro;
using UnityEngine;


public class FinalText : TextMeshProUGUI
{
    
    
    public override string text
    {
    
    
        get {
    
     return base.text; }
        set
        {
    
    
            string val = value;
            if (HasArabic(val))
            {
    
    
                isRightToLeftText = true;
                base.text = GetFixedText(val);
            }
            else
            {
    
    
                isRightToLeftText = false;
                base.text = val;
            }
        }
    }
    
    public static bool HasArabic(string str)
    {
    
    
        if (string.IsNullOrEmpty(str))
            return false;
        int strLength = str.Length;
        for (var i = 0; i < strLength; i++)
        {
    
    
            char c = str[i];
            if (isArabic(c))
            {
    
    
                return true;
            }
        }


        return false;
    }
    
    public static bool isArabic(char c)
    {
    
    
        if (c >= 0x600 && c <= 0x6ff) return true;
        if (c >= 0x750 && c <= 0x77f) return true;
        if (c >= 0xfb50 && c <= 0xfc3f) return true;
        if (c >= 0xfe70 && c <= 0xfefc) return true;
        return false;
    }
    
    protected readonly FastStringBuilder finalText = new FastStringBuilder(RTLSupport.DefaultBufferSize);


    private string GetFixedText(string input)
    {
    
    
        if (string.IsNullOrEmpty(input))
            return input;


        finalText.Clear();
        RTLSupport.FixRTL(input, finalText, false, true, true);
        finalText.Reverse();
        return finalText.ToString();
    }
}

この時点で、アラビア語の適応作業は基本的に終了しており、改行、リッチ テキスト タグ、英語とアラビア語の混在などの問題は RTLTMP Pro 自体で処理されます。

UGUIを適応させる方法

上記プラグインは TMP のみをサポートしており、UGUI には対応していませんが、ソースコードを確認したところ、サポートしていない理由は主に UGUI が RTL 機能、つまり右から左へのレンダリングをサポートしていないためであることがわかりました。
では、UGUI がこの機能をサポートしていれば、UGUI も使用できるのでしょうか? 試してみようと思い、UGUI の頂点の順序をレンダリング時に入れ替えられるように次の変更を加えました。

おすすめ

転載: blog.csdn.net/weixin_42562717/article/details/129417695