独自UIでのJumpScenario後すぐジャンプ先に遷移したい

168 views
Skip to first unread message

ニコ

unread,
Jul 14, 2025, 1:05:24 PMJul 14
to 宴ユーザーグループ
宴のバージョン: 宴4.1.9
UnityのバージョンとOS: Unity6.0(6000.0.51f1) Windows
Unityの習熟度: 初心者。プログラムはできません。

お世話になっております。

状況としては先日回答いただいた質問
(「一つのUIから、再生中のラベルに応じて複数のラベルにジャンプしたい」
https://groups.google.com/u/4/g/utageuser/c/32onrXmj05s)の続きであり、
質問の種類としては以下の3点と重なっているものと思います。
Ⅰ. JumpScenarioについて
https://groups.google.com/u/4/g/utageuser/c/AyDYl-bysHE
Ⅱ. JumpScenario後のクリック入力待ちの処理について
https://groups.google.com/u/4/g/utageuser/c/wsOXxA89p40
Ⅲ. 独自画面のボタンクリック時、JumpScenarioが動かない
https://groups.google.com/u/4/g/utageuser/c/kWBLis_7Yx4

3点質問があります。
シナリオ再生中に独自UIをクリックしてシナリオジャンプを行う際に、
①UIをクリックしたのち追加入力を挟まず表示中のテキストを終わらせ、
 自動的にジャンプ先に遷移させることは可能でしょうか。
②OnInputを用いて①を実現しようとした場合、
 文字送り終了後の「▼」が表示された状態でUIをクリックすると
 ジャンプ先のテキストが一つスキップされてしまう状態を解消すること
 (文字送り中と文字送り終了後とでスキップの挙動を変更すること)は可能でしょうか。
③他の質問で検討されていたBreakAndJumpScenairo機能は今回の質問の解決策にもなりうるでしょうか。

先日の手厚いサポートのおかげで
再生中のシナリオラベルに応じてUIクリック後のジャンプ先を制御することまではできたのですが、
その際表示中のシナリオをクリックで改ページしないとジャンプ先に遷移できないことを確認しました。
テンポ感を考慮し、類似の質問を参考にUIクリック後の表示中テキストのスキップを試み、
特に過去質問Ⅱやその中の「入力待ち状態であれば入力をする」想定でのプログラムを参考に
見よう見まねでOnInputを組み込んでみました。

その結果、文字送り最中にUIをクリックした場合は想定通りのスキップができたのですが、
今回の質問②で述べた「文字送り終了後の『▼』が表示された状態でUIをクリックすると
ジャンプ先のテキストが一つスキップされてしまう」問題にぶつかりました。
過去質問Ⅱの中で懸念されていた挙動かもしれませんが、
もしこれを解決できる方法、もしくはサンプルなどがあれば、お教えいただけませんでしょうか。
今のところ、このような分岐に関わる部分はサウンド待ちやエフェクト待ちが発生しない作りになっております。

また、過去質問Ⅲの中でBreakAndJumpScenairo機能の追加を検討されているとのことでしたが、
もしこちらの機能が今回の私の質問の回答にもなりうる場合は、是非作っていただけるとありがたいです。
過去の質問を拝見すると、
このような用途でのOnInputは擬似的な解決策にはなるものの
あらゆる状況に対しての安定的な動作は保証できないようでしたので、
私のような初心者が見よう見まねで手を出すのはよくないのではないかと少し不安に思っております。
その点、一つの機能としてまとめていただけると実装面でも心理面でも大変助かります。

よろしくお願いいたします。

マッドネスラボ

unread,
Jul 15, 2025, 12:49:51 AMJul 15
to 宴ユーザーグループ
> ①、②
現状だと、簡単に行うのは難しいです。
> ③他の質問で検討されていたBreakAndJumpScenairo機能は今回の質問の解決策にもなりうるでしょうか。
なると思うのですが、まだちょっと副作用を防ぐ落としどころが見えていないです。

「シナリオ割り込み機能」(今のシナリオを即座に中断して、テキスト以外の表示を保ったまま指定のシナリラオベルにジャンプする)を追加しましたので、
添付のパッケージを適用してみてください。
(ダウンロードした添付ファイルの拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)
この変更は次回の宴のアップデートにも反映させる予定ですが、調整が必要なためさらに変更がされる可能性があります。

インポートすると、
Assets/Utage/Scripts/ADV/Extra/AdvInterruptScenario.cs というコンポーネントが追加されるので、
これをAdvEngineオブジェクトにAddComponentしてください。
ss_0999.png


シナリオ割り込み機能の呼び出し方
AdvInterruptScenarioコンポーネントの「InterruputScenario」メソッドでシナリオ割り込み機能を呼び出します。(BreakAndJumpScenairoから名前を変えました)
   //今のシナリオの進行を中断し、テキスト以外の表示は継続したまま指定のラベルのシナリオにジャンプして割り込ませる
public void InterruptScenario(string label)


他のプログラムから使う場合は、次のようにしてください。
    public class Sample : MonoBehaviour
    {
    [SerializeField] AdvInterruptScenario interruptScenario;
   
    void SampleInterrupt()
    {
    string scenarioLabel = "ジャンプ先のシナリオラベル";
    interruptScenario.InterruptScenario(scenarioLabel);
    }
    }

あまり使うことはないかもしれませんが、呼び出すラベルが固定なのであれば、Buttonのクリックイベントなどにも設定可能です。
ss_1001.png


サンプルシナリオ
Assets/Utage/Sample/Scenarios/SampleInterrupt.xls に、シナリオ割り込み機能のサンプルシナリオを追加しました。
これは、割り込みで表示するシナリオ(InterruputScenarioのジャンプ先)のサンプルです。
そのままほかのシナリオにジャンプして通常シナリオにつなげるパターンと、割り込み前のシナリオをロードして元に戻すパターンを記述してあります。
ss_1002.png



サンプルシーン
Assets/Utage/Sample/Sample.unity のサンプルシーンに一時的にシナリオ割り込み機能とその呼び出しボタンを追加してあります。
工事中なので、実際のアップデートでは、このままにはしないと思います。
また、このサンプルはURP版では起動しないので、Built-In RenderPipelineのプロジェクトで確認してください。
ss_1004.png


使用するタイミングの制限に注意
リンク先の別のQ&Aでも述べていますが、今のシナリオを中断してしまうことによる副作用は検証しきれていないです。

  1. すべての「コマンドを安全に中断可能する」というのは複雑すぎるのでおそらくできません。
  2. SendMessageやカスタムコマンドなど、宴側の管理下にないプロジェクト固有の処理があった場合も、自動的に解決処理をするのは不可能です。(個々のカスタム命令ごとに必要応じて処理が必要になります)
  3. フェードインとフェードアウトコマンドのように、組み合わせて使う前提になっているコマンドが前半のみ実行されて中断してしまった場合は、システム側でのフォローは今後も不可能
ということになります。

3以外は、実際に問題が起きる条件は限られるとは思うのですが、
今のところ落としどころが見えていないので、とりあえず特に制限なしで使えるようにしてあります。

実際には、プロジェクトごとに「シナリオ割り込み」機能を呼び出すタイミングを制限することになると思います。
基本的にはメッセージウィンドウ以下か、Menu/Root以下に置けば、改ページ前後の演出中にボタン表示はオフになるので、安全性をとるならその形にしたほうがいいと思います。
ss_1003.png


表示ボタンの制御
実際には、下記のようなコンポーネントを作成して、自動的にボタンのオンオフをするといった処理が必要になると思います。
下記のサンプルは、「シナリオ割り込みのジャンプ先にいる間は、シナリオ割り込みボタンをオフにする」というものです。
(使用する場合は、ボタン自体ではなくAdvEngineオブジェクトなど、シナリオ実行中にアクティブがオフにならないものを使ってください)

//シナリオ割り込み機能を呼び出すボタンの制御コンポーネント
    public class SampleInterruptScenarioButtonController : MonoBehaviour
    {
    // シナリオ割り込みコンポーネント
public AdvInterruptScenario AdvInterruptScenario => this.GetComponentCacheInParent(ref interruptScenario);
[SerializeField] protected AdvInterruptScenario interruptScenario;

//中断シナリオを起動するボタン等のGameObject
[SerializeField] GameObject target;

void Update()
{
if(AdvInterruptScenario==null) return;

if(target==null) return;

//割り込みシナリオを実行中なら、ボタンを非表示にする
target.gameObject.SetActive(!AdvInterruptScenario.InterruptingScenario());
}
    }

これは簡易的なサンプルでしかないです。
プロジェクトごとに、シナリオ割り込みをさせたい場面は異なると思うので、
・プログラムから自動制御する
・シナリオ上からUIのオンオフをする機能を呼び出して、手動制御する
・上記二つの組み合わせ
など、プロジェクトの仕様に合わせた形でアレンジしてください。


2025年7月15日火曜日 2:05:24 UTC+9 ニコ:
UtageCustom_InterruputScenario.unitypackage

ニコ

unread,
Jul 16, 2025, 11:07:27 AMJul 16
to 宴ユーザーグループ
早速のご対応ありがとうございます。
いただいたパッケージを適用することで、思い描いていたとおりのジャンプを行うことができました!

また、今後変更が入る可能性がある点、
なんらかの副作用が起こりうる点についても承知いたしました。
この機能を使う際はできるだけ周囲をシンプルな作りにして
事故の可能性を減らしていこうと思います。

2025年7月15日火曜日 13:49:51 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages