【Unity】TextMeshProでルビ表示
やること
TextMeshProのラベルにルビを表示する。
TextMeshProでのルビ表示。
— enu@遊宴雀2 雀-17 (@_enu) July 19, 2019
上がUnityUI、下がTextMeshPro pic.twitter.com/HOpubc3FTo
コード
Unity2019.1.10
使い方
インポート
- TextMeshPro(2.0.1)をインポートする。
- PackageManagerを使ってインポート
 - メニューのWindow->TextMeshPro->Import TMP Essential Resources
 - メニューのAssets->Create->TextMeshPro->FontAssetで日本語フォントを作成しておく(まあ動かすだけなら英字フォントでもいいんですが)
 
 Unity_TSKT_UIとUnity_TSKT_Containerをインポートするmanifest.jsonに↓を追記すれば良い
{ "dependencies": { "com.github.enue.tskt_ui": "https://github.com/enue/Unity_TSKT_UI.git", "com.github.enue.tskt_container": "https://github.com/enue/Unity_TSKT_Container.git", } }
実行
- 本文用の
TextMeshProもしくはTextMeshProUGUIコンポーネントを作成する。 - ルビ用の
TextMeshProもしくはTextMeshProUGUIコンポーネントを作成し、TMP_RubyTextをアタッチする。TMP_RubyTextは↑の本文用オブジェクトを参照しておく。 - 二つのオブジェクトのrectは一致させておく。(ルビと本文は親子関係ににしとくのが自然でしょう)
 - コード実行
 
[SerializeField] TMP_RubyText ruby; [SerializeField] TMPro.TMP_Text body; void Start() { var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。"; var stringWithRuby = StringWithRuby.Parse(message); ruby.Set(stringWithRuby); body.text = stringWithRuby.body; }
文字送りのやり方
IEnumerator Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message).FoldTag();
    for (int i = 0; i < stringWithRuby.body.Length; ++i)
    {
        var sub = stringWithRuby.Substring(0, i).UnfoldTag();
        ruby.Set(sub);
        body.text = sub.body;
        yield return new WaitForSeconds(0.05f);
    }
}
開発中です
- 既知のバグとして、FontSizeをAutoにしているとルビの位置がおかしくなります。
 - TextMeshProの機能を追いきれてないので多分ほかにもなんかある