さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

【Unity】テキストにルビを表示する・2

 前回記事にしたルビ表示処理にバグがあって、なんやかんや直してたら機能が増えた。リッチテキスト対応!

コード

Unity2019.1.9

github.com

使い方

 リポジトリはUnity packageとして使えるのでmanifest.jsonに追記することでインポートできる。README.MD参照。

インポートしたら

  • 本文用のTextコンポーネントを作成する。
  • ルビ用のTextコンポーネントを作成し、RubyTextをアタッチする。RubyTextは↑の本文用オブジェクトを参照しておく。
  • 二つのオブジェクトのrectは一致させておく。(ルビと本文は親子関係ににしとくのが自然でしょう)
  • コード実行
[SerializeField]
RubyText text;

[SerializeField]
Text body;

void Start()
{
    var message = "{吾輩:わがはい}は猫である。<color=red>名前はまだ無い</color>。\nどこで生れたかとんと{見<color=red>当:けんとう}がつか</color>ぬ。何でも薄暗いじめじめした所で<color=red>ニャーニャー</color>泣いていた事だけは記憶している。";
    var stringWithRuby = StringWithRuby.Parse(message);
    text.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 < ruby.body.Length; ++i)
    {
        var sub = stringWithRuby.Substring(0, i).UnfoldTag();
        text.Set(sub);
        body.text = sub.body;

        yield return new WaitForSeconds(0.05f);
    }
}

 FoldしてSubstringしてUnfold。

FoldTag, UnfoldTagって何?

 リッチテキストタグを扱うための機能です。
 タグが埋め込まれた文字列はそのままだとSubstring等の操作が非常にめんどくさい。そこでFoldTagを行うことでタグをいったん文字列の外に退避させることができます。
 この状態で諸々の文字列操作を行ったあと、UnfoldTagで再びタグを文字列に埋め込み、UI.Textに渡すという具合。

 単にテキストからタグを除きたいという場合にもFoldTagを使うことができます。