【Unity】テキストにルビを表示する・2
フリガナ表示+リッチテキストタグ+文字送り処理。「見当」のあたりの色変え範囲が変なのは、ルビをまたいだときのチェックのため。 pic.twitter.com/ElJQv2YTJ1
— enu@遊宴雀2 雀-17 (@_enu) July 11, 2019
前回記事にしたルビ表示処理にバグがあって、なんやかんや直してたら機能が増えた。リッチテキスト対応!
コード
Unity2019.1.9
使い方
リポジトリは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
を使うことができます。