こんにちは。いつも大変お世話になっております。
おかげさまで、貴社の素晴らしい製品のお力を借りて、日々快適かつ楽しくゲーム開発を続けられております。
現在制作中のプロジェクトにおいて、Utageを使用して吹き出し型の会話演出を実装しております。
通常の会話では MessageWindow を切り替えながら会話を進めることで、ほとんどの演出が問題なく実現できています。
しかしながら、本作に登場する主人公とヒロインの甘酸っぱい恋愛模様を表現するために、
「お互いの気持ちが急いてセリフがかぶってしまい、慌てながらも照れた様子を見せる」といった、
可愛らしい掛け合いを描きたいと考えております。
短いセリフであれば PageCtrl の BrPage を用いて似たような演出が可能ですが、
今回は10文字を超える少し長めのセリフのため、同様の手法では再現が難しい状況です。
そこで、以下のような手法を思いついたのですが、Utageで対応可能かどうかご教示いただけますと幸いです。
セリフがかぶる部分だけシナリオを分割し、メッセージ表示速度を最大に設定する
一方のセリフを TextAnimator TypeWriter で再生し、その直後にもう一方のセリフを再生する
お忙しいところ恐縮ですが、アドバイスをいただけますと幸いです。
今後ともどうぞよろしくお願い申し上げます。
ご回答いただき、誠にありがとうございます。
ご案内いただいた内容をもとに、専用のウィンドウを実装いたしました。
同様の機能を必要とされる他のユーザーの参考になればと思い、実装したコードをあわせて添付させていただきます。
また、TextMeshProを使用する中で、フォールバックが発生した際に TextMeshPro の子オブジェクトとして SubMeshUI が生成され、
テキストを更新してもこれが削除されずに残る問題を確認いたしました。
この現象に対応するために、MessageWindow の OnTextChanged 関数内で TextMeshPro の ForceUpdate などを試みましたが、
SubMeshUI は削除されず残ったままでした。
この問題は、どうやら TextMeshPro の根本的な仕様に起因しているように思われます。
そこで対策として、テキスト更新時に TextMeshPro オブジェクトを一旦非アクティブ化し、再度アクティブ化することで
不要な SubMeshUI が除去されることを確認し、それを補完するコードも併せて共有いたします。
いつも大変有用に活用させていただいております。
今後ともよろしくお願い申し上げます。
おっしゃる通りです。
ただし、TextMeshProがリアルタイムでテキストを更新する際、フォントフォールバックに伴う SubMeshUI の処理がやや不完全であるように思われます。
フォールバックが発生した際に、以下のリンク先の記事にもあるように、
テキストが重なって表示される現象が発生し、見た目にも非常に良くないため、修正を試みました。
https://discussions.unity.com/t/unwanted-submesh-text-persistence/727758/2
あ、そしてお伝えし忘れておりましたが、セリフを同時に再生するロジックの処理手順は以下の通りです。
シナリオ内で AdvCommandTimeCtrlText コマンドを、AdvUguiBubbleMessageWindowTMP を継承した MessageWindow に割り当てます。
> Arg6には、セリフのウェイト時間を設定します。
続くセリフは、通常のセリフ再生コマンドを記述します。
このロジックにはいくつか致命的な課題がございます。
可能であれば SendMessage を使って実装したかったのですが、Utage内部の AdvCommandText のロジックをできる限り再利用し、互換性のある機能を実現したかったため、これを継承した AdvCommandTimeCtrlText を作成しました。
そのため、AdvCommandParser に AdvCommandTimeCtrlText を使用するためのコマンド定義を追加する必要がありました。
完全に同時進行させるよりも、一部のセリフを先に再生し、次のセリフに繋げるような演出が非常に魅力的に感じたため、Arg6を利用しています。
> しかし AdvCommandText を継承している関係上、Arg6は AdvCommandText と AdvCommandTimeCtrlText の両方に影響を与えてしまう、扱いづらい変数となっています。
このような制限があるため、公式的なサポート機能として提供するには、既存のUtageフォーマットに適した形で再設計する必要があると考えます。
あくまで私自身の環境に合わせて独自に修正・実装したものですので、
この機能を利用される場合は、ユーザー側でUtageの仕組みに対する十分な理解と、適切なソリューションかどうかの検討が必要となります。