シナリオ割り込み


投稿日:2025年7月20日 | 最終更新日:2025年7月20日

 概要

「シナリオ割り込み」は、現在再生中のシナリオを強制的に中断して、テキスト以外の表示を保ったまま、指定のシナリオラベルを再生する機能です。
今のシナリオに割り込んで別にシナリオを再生したり、また元のシナリオに戻るための機能です。

 サブシナリオ機能やJumpScenarioとの違い

サブシナリオはいったん今のシナリオや表示を全てクリアしてしまいます。今のシナリオとは連続しない別のシナリオ(サブシナリオ)を再生する機能です。
JumpScenarioは今のシナリオに続けて指定のシナリオラベルを再生するものですが、即座にジャンプするのではなく改ページ処理が入った後にジャンプするため、意図通りの動作をしないことがあります。
これに対して、シナリオ割り込みは「今の表示を保ったまま」「即座に」指定のシナリオラベルを再生します。

シナリオ割り込み機能の呼び出し方

シナリオ割り込みは、基本的にはプログラムから呼び出します。
Version4.2.0以降では、Assets/Utage/Scripts/ADV/Extra/AdvInterruptScenario.cs というコンポーネントが追加されているので、これをAdvEngineオブジェクトにAddComponentしてください。
AdvInterruptScenarioコンポーネントの「InterruputScenario」メソッドでシナリオ割り込み機能を呼び出します。

    //今のシナリオの進行を中断し、テキスト以外の表示は継続したまま指定のラベルのシナリオにジャンプして割り込ませる
        public void InterruptScenario(string label)

他のプログラムから使う場合は、次のようにしてください。

    public class Sample : MonoBehaviour
    {
        [SerializeField] AdvInterruptScenario interruptScenario;

        void SampleInterrupt()
        {
            string scenarioLabel = "ジャンプ先のシナリオラベル";
            interruptScenario.InterruptScenario(scenarioLabel);
        }
    }

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

サンプルシナリオ

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

サンプルシーン

Assets/Utage/Sample/Sample.unity のサンプルシーンに一時的にシナリオ割り込み機能とその呼び出しボタンを追加してあります。

デフォルトだとボタンが表示されないので、試すときはAdvEngineオブジェクトの「SampleInterruptScenarioButtonController」コンポーネントのenabledをオンにしてください。

 シナリオ割り込みを使うときの注意点

シナリオ割り込みは、今のシナリオを強制的に中断してしまうため、中断による副作用が検証しきれていません。

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

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

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

表示ボタンの制御

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

    //シナリオ割り込み機能を呼び出すボタンの制御コンポーネント
    public class SampleInterruptScenarioButtonController : MonoBehaviour
    {
        // ADVエンジン
        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のオンオフをする機能を呼び出して、手動制御する
・上記二つの組み合わせ
など、プロジェクトの仕様に合わせた形でアレンジしてください。