ルビのインライン設定とオンオフシステムを実装しました。
今回のメッセージ表示(中央からのタイピング)とかなり相性が悪く、
漢字表示時にルビを振ることができなかったため、メッセージ表示後にルビ表示という設定になりました。
ルビシステム
構成ファイル
| ファイル | 種別 | 内容 |
|---|---|---|
| Sys_RubyRenderer.cs | 新規 | ルビ生成・管理 |
| Sys_Messenger.cs | 追記 | メッセージ・名前ルビ連携 |
| Sys_TextSettingsManager.cs | 追記 | ルビON/OFF設定管理 |
| UI_TextSettingsPanel.cs | 追記 | ルビON/OFFボタンUI・プレビュー |
| Sys_SaveManager.cs | 修正 | previewTextのタグ除去 |
新規スクリプト「Sys_RubyRenderer.cs」

テキスト記述形式
Inspector の「conversations[].message」と「charaName」に直接インラインで記述する。
// メッセージ
<r=さとうくん>佐藤君</r>、<r=じょうほう>情報</r>が<r=ただ>正</r>しければ…
// 名前
<r=いとう>伊藤</r>

オブジェクト構成
Msg_Panel(既存メッセージパネル)
├── Msg_text(既存・TMP本体)
├── RubyRoot(Sys_RubyRendererが動的生成)
│ └── Ruby_xxx(ルビ1つにつき1個・動的生成)
└── Msg_Panel_Wait_Icon(既存)
Name_Plate(既存ネームプレート)
├── Name_Text(既存・TMP本体)
└── RubyRoot(Sys_RubyRendererが動的生成)
└── Ruby_xxx(動的生成)
PreviewWindow(テキスト設定・プレビュー)
├── PreviewMessage(既存・TMP本体)
└── RubyRoot(Sys_RubyRendererが動的生成)
└── Ruby_xxx(動的生成)
Unity上のアサイン設定
| コンポーネント | フィールド | アサイン先 |
|---|---|---|
| Sys_Messenger | rubyRenderer | Msg_Panel の Sys_RubyRenderer |
| Sys_Messenger | nameRubyRenderer | Name_Plate の Sys_RubyRenderer |
| UI_TextSettingsPanel | previewRubyRenderer | PreviewWindow の Sys_RubyRenderer |
| UI_TextSettingsPanel | btnRubyOn | ルビONボタン |
| UI_TextSettingsPanel | btnRubyOff | ルビOFFボタン |
処理フロー
■ メッセージ
① OnEnable
→ rubyRenderer.Initialize(messageText)
→ nameRubyRenderer.Initialize(charaNameText)
→ RubyRootを動的生成(既存なら再利用)
→ SYS_RUBY_VISIBLEからON/OFF状態を復元
② ShowNextMessage(次メッセージへ進む前)
→ rubyRenderer.Clear()
→ nameRubyRenderer.Clear()
→ charaNameText.text = StripRubyTags(charaName)
→ nameRubyRenderer.Render(charaName, charaNameText)
③ DisplayMessage(タイピング処理)
→ plainText = StripRubyTags(text) でタグ除去
→ plainTextでタイピング表示
→ タイピング完了後
→ rubyRenderer.Render(text, messageText)
④ スキップ時
→ messageText.text = plainText で即時全文表示
→ rubyRenderer.RenderAll(messageText) で一括生成
⑤ FinishConversation
→ nameRubyRenderer.Clear()
プレビュー
① UI_TextSettingsPanel.Start()
→ previewRubyRenderer.Initialize(previewMessageText)
② PreviewLoop()
→ plainTextでタイピング表示
→ タイピング完了後
→ previewRubyRenderer.Render(PREVIEW_TEXT, previewMessageText)
→ AutoWait後にpreviewRubyRenderer.Clear()
→ ループ

ON/OFF管理
| 項目 | 内容 |
|---|---|
| 保存キー | SYS_RUBY_VISIBLE |
| 保存先 | global_system.json |
| デフォルト | ON(true) |
| 切り替え | UI_TextSettingsPanel のボタン2つ |
| 即時反映 | rubyRoot.SetActive() で現在表示中のルビに反映 |

現状の制約
| 制約 | 内容 |
|---|---|
| 表示タイミング | タイピング完了後に一括表示 |
| 同一文字列 | 前方から順に対応 |
| 自動改行またぎ | 非対応 |
| 縦書き | 非対応 |
未解決の課題(将来対応?)
ルビ表示タイミングの改善
「漢字表示直後にルビを出す」実装を試みたが、
メッセージパネルが中央から広がる演出との座標同期が困難で断念。

解決するには以下のいずれかが必要。
- パネルの広がり演出を廃止して固定幅にする
- タイピング中のパネルサイズ変化をルビ座標に毎フレーム反映する
左揃えテキストであればタイピング中の逐次表示が可能。
中央揃えのみ困難。
実機での挙動
やはりメッセージ後に一括表示は違和感があります。
左揃えスタートの場合は、タイミングも位置もうまくいったので、
中央スタートとトレードオフとなっている状況ですね。
現状では、Claudeでも限界難易度になっていたので、今回は妥協するしかないようです。

コメント