テキストが変わった時のイベントトリガーの不具合

68 views
Skip to first unread message

nunu

unread,
May 8, 2024, 1:44:55 PMMay 8
to 宴ユーザーグループ
・宴のバージョン:4.0.7
・Unityのバージョン:2022.3.21f1
・OSバージョン:Windows11
・Unityの習熟度:宴のSendMessageは使えます


お世話になっております。
AdvPageなどのテキストが変わった時のイベントトリガーについて、不具合がありましたのでご報告させていただきます。

■AdvPage:OnBeginText
■AdvPage:OnChangeText
 ⇒1つ前の台詞のメッセージウインドウの状態が参照されてしまう
  例:nameText.textで話者名を取得すると、直前に喋っていたキャラ名が取得される

■AdvMessageWindowManager:OnTextChange
■AdvUguiMessageWindow:OnPostChangeText
 ⇒起動直後の最初の台詞のみ、イベントが発火しない
  一度タイトル画面に戻ってかシナリオを再生すると、最初の台詞でもイベントが発火する


不具合が再現するプロジェクトをお送りすることも可能ですので、必要でしたらお申し付けください。
お手数をおかけしますが、どうぞよろしくお願いいたします。

マッドネスラボ

unread,
May 8, 2024, 7:29:48 PMMay 8
to 宴ユーザーグループ
すみません。
私の方で不具合を再現できませんでした。

お手数おかけいたしますが、再現プロジェクトを送信をお願いします。


2024年5月9日木曜日 2:44:55 UTC+9 nunu:

nunu

unread,
May 9, 2024, 3:02:32 AMMay 9
to 宴ユーザーグループ
ご返信いただき大変恐れ入ります。
不具合が再現するプロジェクトをアップロードさせていただきました。
送信したファイル名は「NameTextChangeSample.unitypackage」です。

「Assets\Scripts」フォルダに「NameTextColor.cs」のファイル名で、キャラ名に応じてNameTextの文字色を変えるプログラムを入れておきました。

最初は「AdvPage:OnChangeText」に色変えの処理が設定されていると思うので、別のイベントトリガーに付け替えていただくとそれぞれ確認ができるかと思います。

キャラと文字色の対応は下記のようになっています。
うたこ:赤
ラン:青
ロボ子:緑

お手数をおかけしますが、よろしくお願いいたします。


2024年5月9日木曜日 8:29:48 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 9, 2024, 3:43:48 AMMay 9
to 宴ユーザーグループ
送信ありがとうございます。確認できました。


AdvEngineのイベントのタイミングに起因する問題のようでした。
AdvEngineのイベントは、基本的にはまだUIへの値の変更がされていないタイミングです。

おおざっぱには、
AdvEngineの更新 → 各種イベントの発行 → 「UIの更新」という流れになります。
なので、イベントが呼ばれたときにUIの内容を取得(テキスト内容の判別など)をしようとしても、まだUIが更新されていないので前の状態のままになっているという理屈です。

キャラクター名等は、AdvePageから取得するようにしてください。

以下、サンプルコードです。
引数が(AdvPage page)と変えてあるので、インスペクター上のイベントの設定をし直してください。

public class NameTextColor : MonoBehaviour
{
public TextMeshProUGUI NameText;

public void ChangeNameTextColor(AdvPage page)
{
var nameText = page.NameText;
Color color = new Color(1.0f, 1.0f, 1.0f, 1.0f);
switch (nameText)
{
case "うたこ":
color = new Color(1.0f, 0.0f, 0.0f, 1.0f);
break;
case "ロボ子":
color = new Color(0.0f, 1.0f, 0.0f, 1.0f);
break;
case "ラン":
color = new Color(0.0f, 0.0f, 1.0f, 1.0f);
break;
}
NameText.color = color;
}

}


2024年5月9日木曜日 16:02:32 UTC+9 nunu:

マッドネスラボ

unread,
May 9, 2024, 3:48:35 AMMay 9
to 宴ユーザーグループ
こちらのページにある、 イベントの使用例のコードも参考にしてみてください。
AdvTextSound.csやAdvCharacterGrayOutControllerなどです。
https://madnesslabo.net/utage/?page_id=6398


2024年5月9日木曜日 16:43:48 UTC+9 マッドネスラボ:

nunu

unread,
May 9, 2024, 5:55:42 AMMay 9
to 宴ユーザーグループ
ご回答ありがとうございました。
まだまだ不勉強でお手間をおかけし大変失礼いたしました……!
お陰様で、NameTextの取得については解決できました!

ここからは要望に近いかと思うのですが、台詞本文やキャラ名からTextMeshProの「textInfo」の取得は可能でしょうか?
n行目のcharacterCountやlengthなどを取得し、文字送り開始と同時に発生する演出をつけたいという用途のイメージです。

お手数をおかけしますが、よろしくお願いいたします。


2024年5月9日木曜日 16:48:35 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 9, 2024, 3:16:46 PMMay 9
to 宴ユーザーグループ
TextMeshProの状態は、AdvEngine側では更新していないので、
やるとすれば、AdvUguiMessageWindowのOnPostChangeTextを使う形になります。

> ■AdvUguiMessageWindow:OnPostChangeText
> ⇒起動直後の最初の台詞のみ、イベントが発火しない
>  一度タイトル画面に戻ってかシナリオを再生すると、最初の台詞でもイベントが発火する
とのことでしたが、私の方では再現できませんでした。

もしかすると、OnPostChangeTextイベント登録のタイミングの問題かもしれません。
たとえば、AdvCharacterGrayOutControllerやAdvTextSoundなども下記のようにAwake内でイベントを登録してしまっているのですが、
void Awake()
{
Engine.Page.OnBeginPage.AddListener(OnBeginPage);
Engine.Page.OnUpdateSendChar.AddListener(OnUpdateSendChar);
}

これは宴に限らない話なのですが、
UnityのAwake()メソッドは、GameObjectが最初にActiveになったときに呼ばれます。
逆に言うと初期状態でActiveがオフのものは、オンになるまでAwakeが呼ばれません。
なので、そのコンポーネントのあるGameObjectのアクティブがオンになるタイミングが、登録したイベントが発行されるタイミングよりも遅い場合はイベントの登録が間に合わないで呼ばれないことになります。

この問題の解決策としては、Awakeメソッド内ではなく、Unityエディタのシーンのコンポーネントのインスペクター経由でイベントを登録するようにしてください。
インスペクター経由でイベントを設定している場合は、
非アクティブなものであってもUnityシーンがロードされた時点でイベントの登録がされるので、上記の順番に左右されずイベントを登録できます。

本当なら、Unityに非アクティブでも呼ばれるような初回初期化メソッドがあればそれを使えばこの辺は割とスムーズに書けるのですが、
それができないため、この辺がちょっと難しいことなってしまっています。



2024年5月9日木曜日 18:55:42 UTC+9 nunu:

nunu

unread,
May 9, 2024, 5:41:24 PMMay 9
to 宴ユーザーグループ
textInfoの件もご回答ありがとうございます。
こちらのプロジェクトだと、インスペクター経由でイベントを登録したにも関わらず、起動直後のみイベントが発火しない状態でした。

別ファイルになってしまうのですが、OnPostChangeTextでtextInfoの取得が確認できるプロジェクトもお送りできます。
(他の方からのお問い合わせもありますので、ご無理のない範囲でご助言をいただけると大変助かります……!)

2024年5月10日金曜日 4:16:46 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 10, 2024, 6:45:38 PMMay 10
to 宴ユーザーグループ
ありがとうございます。
プロジェクトの送信よろしくお願いします。


2024年5月10日金曜日 6:41:24 UTC+9 nunu:

nunu

unread,
May 10, 2024, 10:07:39 PMMay 10
to 宴ユーザーグループ
ありがとうございます!
「UtageTextInfo.unitypackage」のファイル名でプロジェクトを送信させていただきました。
お忙しいところ大変恐れ入りますが、どうぞよろしくお願いいたします。

2024年5月11日土曜日 7:45:38 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 11, 2024, 12:11:13 AMMay 11
to 宴ユーザーグループ
すみません、不具合の再現手順のほうも送信していただけるでしょうか。
(宴のあるシーンファイルを実行してみたのですが、そのままでは動かないようでした)




2024年5月11日土曜日 11:07:39 UTC+9 nunu:

マッドネスラボ

unread,
May 11, 2024, 1:08:32 AMMay 11
to 宴ユーザーグループ
おそらくですが、パッケージ作成の際に、なんらかの原因で足りないプラグインなどがあるようでいくつかのコンポーネントが無効化されてるようでした。
一応こちらで当たりをつけて動かすことはできたのですが、
起動後最初の一回目のセリフ表示の際に、OnPostChangeTextは呼ばれているようでした。
設定されているメソッドのソースコードにDebugLogを表示させたところ、ログは表示されていました。
ただ、その後の挙動でコンソールに色々warningが出ているのですが、これはこのプログラム自体のなんらかの不具合かもしれません。
詳しくはわかりませんが、これが原因で動作してないように見えているだけで、イベント自体は呼ばれているかと思います。






2024年5月11日土曜日 13:11:13 UTC+9 マッドネスラボ:

nunu

unread,
May 11, 2024, 1:18:01 AMMay 11
to 宴ユーザーグループ
パッケージの方に不備があり申し訳ありません!
こちらでも確認してみますのでお待ちいただけますでしょうか。

2024年5月11日土曜日 14:08:32 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 11, 2024, 1:41:33 AMMay 11
to 宴ユーザーグループ
はい。大丈夫です。
完全なプロジェクトになっていないのは、宴のパッケージ作成の機能の問題かもしれません。

再生自体は問題なさそうなので
Debug.Logで確認するなどして、OnPostChangeTextが呼ばれていないのか、呼ばれているけれどもその後のプログラムが動かないのかを確認してみてください。
もし、やはり不具合があるようでしたら、その再現手順をお伝えください。








2024年5月11日土曜日 14:18:01 UTC+9 nunu:

nunu

unread,
May 11, 2024, 2:03:03 AMMay 11
to 宴ユーザーグループ
こちら確認させていただきました。
説明不足でご迷惑をおかけし重ね重ね申し訳ないです……!

下記に詳細を記載させていただきます。不明点がございましたら仰っていただければと思います。

------------------------------
■エラーについて
宴のあるシーンファイルを実行した時に動かないのは、InputManagerがインストールされていないためだったようです。
すでに解決されたかと思いますが、こちらの環境ではInputManagerをインストール→Unity再起動でクリックが反応するようになりました。

プラグイン等でwarningが出ていますが、これらは関係ないので無視していただけますと助かります。


■ご確認いただきたい内容・確認手順
タイトル画面をクリックして先に進むと、台詞が表示されるかと思います。

この時表示されるメッセージウィンドウ「MessageBarAnim」の子要素「Bg」「Bg2」に不具合が発生している状態です。
「Bg」「Bg2」は、画面左側の台詞本文の背景画像(青色の帯)にあたります。

OnPostChangeTextに設定されている「TMPChangeScale」の処理で、TextMeshProのtextInfoを取得し、画像(青色の帯)のImageのWidthを変更する仕組みです。
この処理のプログラムは「Assets\Scripts\SendMessage」フォルダ内の「TMPscale.cs」にあります。

仰る通りOnPostChangeTextは発火しているようなのですが、起動直後の最初の台詞のみ画像(青色の帯)のImageのWidthが0のまま変更されず、台詞背景が表示されない状態となっています。
(2番目以降の台詞では台詞背景が表示されるかと思いますが、これが正しい挙動です)

Debug.Logで確認すると、textInfoのlineInfo[行数].characterCountやtexInfo.lineInfo[行数].lengthも「0」で取得されているようでした。
------------------------------

お手数をおかけしますが、よろしくお願いいたします。


2024年5月11日土曜日 14:41:33 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
May 11, 2024, 5:10:14 AMMay 11
to 宴ユーザーグループ
プロジェクトの送信ありがとうございます。

非常に複雑なのですが、結論から言いますと……
OnPostChangeTextのイベントのときは、textInfoが取得できるとは限らないので、
下記のようにしてみてください。
HasChangedという変更があったというフラグだけ立てて、
LateUpdateメソッドでそれを監視して、変更なかったら何もせず、変更フラグが立っていたら更新処理をかけるイメージです。


bool HasChanged { get;set; }
public void TMPChangeScale()
{
// Debug.Log("TMPChangeScale");
HasChanged = true;
}

private void LateUpdate()
{
if(!HasChanged) return;
HasChanged = false;
var texInfo = _text.textInfo;
以下略。これ以下に本来やりたかった処理を書いてください。


宴のTextMeshPro対応をしたときも引っかかったことなのですが、どうもTextMeshProのTextInfoは取得できるタイミングが限られているようです。
LateUpdateを使っているのは宴の実装部分の影響もあるのですが、このタイミングなら宴側でかける更新とTextMeshProでかける更新が終わっているかと思います。

ただし、行いたい処理がLateUpdateのタイミングでは間に合わないものであった場合は、もう少しタイミングの調整が必要になります。





2024年5月11日土曜日 15:03:03 UTC+9 nunu:

nunu

unread,
May 11, 2024, 10:16:29 AMMay 11
to 宴ユーザーグループ
お忙しいところご調査いただき、大変恐れ入ります。
お送りしたプロジェクトの処理も調べながら組むのがやっとでしたので、宴開発者様の見解を伺うことができて良かったです……!

ご提示いただいたサンプルコードも参考に、対策を考えてみようと思います。
ご回答いただきありがとうございました!

2024年5月11日土曜日 18:10:14 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages