> ①、②
現状だと、簡単に行うのは難しいです。
> ③他の質問で検討されていたBreakAndJumpScenairo機能は今回の質問の解決策にもなりうるでしょうか。
なると思うのですが、まだちょっと副作用を防ぐ落としどころが見えていないです。
「シナリオ割り込み機能」(今のシナリオを即座に中断して、テキスト以外の表示を保ったまま指定のシナリラオベルにジャンプする)を追加しましたので、
添付のパッケージを適用してみてください。
(ダウンロードした添付ファイルの拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)
この変更は次回の宴のアップデートにも反映させる予定ですが、調整が必要なためさらに変更がされる可能性があります。
インポートすると、
Assets/Utage/Scripts/ADV/Extra/AdvInterruptScenario.cs というコンポーネントが追加されるので、
これをAdvEngineオブジェクトにAddComponentしてください。
シナリオ割り込み機能の呼び出し方
AdvInterruptScenarioコンポーネントの「InterruputScenario」メソッドでシナリオ割り込み機能を呼び出します。(BreakAndJumpScenairoから名前を変えました)
//今のシナリオの進行を中断し、テキスト以外の表示は継続したまま指定のラベルのシナリオにジャンプして割り込ませる
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 のサンプルシーンに一時的にシナリオ割り込み機能とその呼び出しボタンを追加してあります。
工事中なので、実際のアップデートでは、このままにはしないと思います。
また、このサンプルはURP版では起動しないので、Built-In RenderPipelineのプロジェクトで確認してください。
使用するタイミングの制限に注意
リンク先の別のQ&Aでも述べていますが、今のシナリオを中断してしまうことによる副作用は検証しきれていないです。
- すべての「コマンドを安全に中断可能する」というのは複雑すぎるのでおそらくできません。
- SendMessageやカスタムコマンドなど、宴側の管理下にないプロジェクト固有の処理があった場合も、自動的に解決処理をするのは不可能です。(個々のカスタム命令ごとに必要応じて処理が必要になります)
- フェードインとフェードアウトコマンドのように、組み合わせて使う前提になっているコマンドが前半のみ実行されて中断してしまった場合は、システム側でのフォローは今後も不可能
ということになります。
3以外は、実際に問題が起きる条件は限られるとは思うのですが、
今のところ落としどころが見えていないので、とりあえず特に制限なしで使えるようにしてあります。
実際には、プロジェクトごとに「シナリオ割り込み」機能を呼び出すタイミングを制限することになると思います。
基本的にはメッセージウィンドウ以下か、Menu/Root以下に置けば、改ページ前後の演出中にボタン表示はオフになるので、安全性をとるならその形にしたほうがいいと思います。
表示ボタンの制御
実際には、下記のようなコンポーネントを作成して、自動的にボタンのオンオフをするといった処理が必要になると思います。
下記のサンプルは、「シナリオ割り込みのジャンプ先にいる間は、シナリオ割り込みボタンをオフにする」というものです。
(使用する場合は、ボタン自体ではなく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 ニコ: