JumpScenario後のクリック入力待ちの処理について

133 views
Skip to first unread message

ダイス

unread,
Jul 1, 2025, 9:18:57 AMJul 1
to 宴ユーザーグループ
宴Ver: 4.1.8
Unity Ver: 6000.0.35f1
プログラム初心者

お世話になります。

こちらの内容の追加質問のような形になるかと思います。
https://groups.google.com/g/utageuser/c/AyDYl-bysHE

こちらの基本的な処理ですと同じシナリオ内、ラベルの移動をするとクリックが必要な状態になります。

AdvEngineを眺めてみましたが、スクリプトでクリック入力をさせて自動遷移させるような方法はあるでしょうか?

よろしくお願いします。

マッドネスラボ

unread,
Jul 1, 2025, 10:11:38 AMJul 1
to 宴ユーザーグループ
前提としては、シナリオ上でEndScenarioかPauseScenarioコマンドを呼び出している間に使うというのが基本の形となっています。

任意のコマンドの途中でJumpScenarioを呼び出した場合、
次のようなプログラムが呼ばれ、今のシナリオが一区切りしてからシナリオジャンプする状態になります。

//すぐにジャンプせずに、ジャンプラベルを予約することで現在のシナリオの状態を保ったままジャンプする
ScenarioPlayer.MainThread.JumpManager.RegistoreLabel(label);


通常の改ページ待ちだけなのであれば、
>プログラムから入力処理を呼び出す
を参考にして、
UguiManagerのOnInput()を呼び出せば、入力処理をプログラムから呼び出せます。

改ページ以外に、複数の入力待ちがあったり、選択肢の入力待ちがあったり、エフェクトの終了待ちがある場合などは、
その待機入力も一度に行なったり、選択肢の入力待ちを解除したり、エフェクトの終了待ちを解除する必要がでてきます。

カスタム可能な待機処理もあるので、これら全てを吸収するような自動入力処理のようなプログラムはありません。
ただ、下記のプログラムが参考になるかもしれません。
エージング(ゲームを自動実行するテスト)のための簡易的なコードなのですが、コマンドに合わせて自動入力処理をするといったことをしています。
Utage/Scripts/ADV/Extra/AdvAgingTest.cs
(ただ、これはスキップ機能と組み合わせて使う前提なので、エフェクト待ちなどをスキップできるプログラムではありません)

現実的には、ある程度JumpScenarioを呼び出すタイミングを絞る必要があると思います。


ScenarioPlayer.MainThread.JumpManager.RegistoreLabel(label)をせずに、
即座に今のコマンドを中断してジャンプシナリオするような処理はありません。
仮に拡張してそれを実装したとしても、コマンドの途中で中途半端に中断してしまうことは意図しない動作となって、制御不能な不具合を生み出してしまう結果になるかと思います。




2025年7月1日火曜日 22:18:57 UTC+9 ダイス:

ダイス

unread,
Jul 2, 2025, 3:39:57 AMJul 2
to 宴ユーザーグループ
過去にも似たようなスレッドを確認していたものの、実際に導入しようと構築した中身を見ていくと、
もしかすると瞬間的な不具合になるようなことがあるかもしれません。
今の時点ではOnInputで動くようになりましたが、動作検証においては時間を要しそうです。
基本的な使い方なら大丈夫のような気がしますが、過信しないようにしようと思います。

何かしらの不具合が出た場合はこの部分を考慮し、制御が難しいなら無理をしない方がいいのかもしれません。
自動入力処理の方も参考にさせていただきます。

ありがとうございました。

2025年7月1日火曜日 23:11:38 UTC+9 マッドネスラボ:

ダイス

unread,
Jul 3, 2025, 6:03:10 AMJul 3
to 宴ユーザーグループ
すみません、こちらに付随した内容なので、どっちに質問しようか悩んだのですが、

InputUtil.EnableInput = false; で入力を無効化している状態で、OnInputが入力待ちになっている状態を無効化する方法はあるでしょうか?
OnInputで強制入力状態にしたものの、シナリオジャンプしない時でもOnInputが通ってしまう状態なので入力を打ち消せればと思ったのですが、
AdvUguiManagerを見てても方法が分かりませんでした。

AdvPage.csで以下のものを見つけたのですが、関係はあるでしょうか?

    void OnEndWaitInputOrPageEnd()
    {
        if (IsPageEnd)
        {
            ToNextCommand();
        }
        else
        {
            OnEndInputWait();
        }
    }



以下のコードでは InputUtil.EnableInput = true; になると  void OnEnable() で自動でクリックが入力されてテキストが進んでしまう状態になっています。
入力待ちを打ち消す方法があれば教えていただければと思います。

public class AdvEngineController : MonoBehaviour
{
    // ADVエンジン
    public AdvEngine AdvEngine { get { return advEngine; } }
    [SerializeField]
    protected AdvEngine advEngine;

    //再生中かどうか
    public bool IsPlaying { get; private set; }

    float defaultSpeed = -1;

    AdvUguiManager UguiManager => uguiManager ?? (uguiManager = FindFirstObjectByType<AdvUguiManager>());
    public AdvUguiManager uguiManager;

    [SerializeField] float autoInputDelay = 0.1f; // 少し待ってから入力

    void OnEnable()
    {
        // ジャンプ直後に呼ばれることを想定
        StartCoroutine(AutoInputCoroutine());
    }

    System.Collections.IEnumerator AutoInputCoroutine()
    {
        yield return new WaitForSeconds(autoInputDelay);
        if (UguiManager != null)
        {
            UguiManager.OnInput(); // 強制入力でクリック不要に
        }
    }

    //指定のラベルのシナリオを再生する
    public void JumpScenario(string label)
    {
        StartCoroutine(JumpScenarioAsync(label, null));
    }

    IEnumerator JumpScenarioAsync(string label, Action onComplete)
    {
        IsPlaying = true;
        AdvEngine.JumpScenario(label);

        // 自動で進行するように、クリック待ちを飛ばす
        yield return new WaitForSeconds(0.1f); // 少しだけ待つ
        var ugui = FindFirstObjectByType<AdvUguiManager>();
        if (ugui != null)
        {
            ugui.OnInput(); // 入力処理を強制実行
        }

        while (!AdvEngine.IsEndOrPauseScenario)
        {
            yield return null;
        }
        IsPlaying = false;
        onComplete?.Invoke();
    }
2025年7月2日水曜日 16:39:57 UTC+9 ダイス:

マッドネスラボ

unread,
Jul 3, 2025, 9:36:29 AMJul 3
to 宴ユーザーグループ
InputUtil.EnableInput はシナリオの進行部分によってオンになったりオフになったりはしないです。
単に一時的に手前にUIを表示している時に、内部のUI処理プログラムのうちキーボード入力関連の部分を反応させないためのものです。
これがをオフになっているかどうかが、クリック入力待ち状態に関係あるわけではないです。

入力待ちを打ち消すのは無理です。
入力待ち状態を強制的に変更することは、ソースコードを改変すれば可能ですが、その場合であっても単に適切な処理がされないだけになります。

おそらく必要なのは、「入力待ち状態であれば入力をする」という処理かと思います。
検証してないのですが、下記のような形にすれば、ページ操作待ちがクリックなどで解除できるものに関しては、自動で進行させることができるかと思います。
実際にはシナリオ終了時にJumpScenarioされた場合は即座にジャンプするので、必要に応じてそういった場合の処理も必要です。
また、 OnBeginPageやOnEndPageを使って、ページ区切りが終わったときや開始を検知して、不要な入力をしないようにする必要があるかもしれません。
(改ページ後同一フレームで次のページの待機処理が始まる可能性があるかもしれないです)

AdvEngine.JumpScenario(label);

var ugui = FindFirstObjectByType<AdvUguiManager>();

//ページ処理状態がNoneになるまで(改行、改ページ待ちなどの状態である限り)、1フレームごとに入力処理を繰り返す
while(Engine.Page.Status != AdvPage.PageStatus.None)
{
ugui.OnInput(); // 入力処理を強制実行
//次のフレームへ
yield return null;
}



先述したように、JumpScenarioは「今のシナリオが一区切りしてからシナリオジャンプ」という形になります。
「一区切り」までプログラムから自動スキップするには、
「待機処理をプログラムから自動スキップ」する必要があるということになります。

ページ操作待ちがクリックなどで解除できるものであれば、上記のコードでも自動スキップできると思います。
ですが、すべてコマンドに対応した、待機処理のプログラムからの自動スキップ現実的には難しいと思います
  •   選択肢のように「(ユーザーの意思決定が必要なので)自動で行うのが不可能なコマンド」がある
  •   一部のエフェクトのように、入力でスキップできず「一定時間待つ」「何かが(サウンド再生など)終わるまで待つ」というコマンドがある
  •   カスタムコマンドのように、独自処理をしているものは必要に応じてそれに対応したプログラムが必要になるため

多くの場合は、そういったコマンドは例外的なものやエフェクト関係のコマンドなので、
そういったコマンドを使用中には、JumpScenarioを呼び出すボタンを非常時にしたりなどして制限をかける必要があるかと思います。
シナリオの書き方やJumpScenarioを呼び出すボタンの制御プログラムなどを工夫して、
必要なときだけJumpScenarioが呼ばれるようにして、難しい処理をしなくてよいようにしてみてください。



2025年7月3日木曜日 19:03:10 UTC+9 ダイス:

ダイス

unread,
Jul 3, 2025, 10:37:27 AMJul 3
to 宴ユーザーグループ
入力待ちされているのを打ち消すのは不可能でしたか。かなり無謀なことを考えてしまい、申し訳ない気持ちです。

再度色々といじっていて思ったことは、自分が構想していた内容は実装するとなると面倒だなと改めて思いました。
メニュー画面に戻るような直通操作だったら問題はないようですが、それ以外だと過程の処理が面倒に感じました。

前までは同じシナリオ内でジャンプする場合はクリック入力が必要な状態になるので、ダイアログで表示して手動入力で対応していましたが、
その方が無難かもしれません。今回のはメニュー画面に戻る時のみ導入しようかと思います。
ラベル内でシナリオジャンプしているものの、一区切りというわけではないことで今回のような内容になりました。

すみません、お手数おかけしました。

2025年7月3日木曜日 22:36:29 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages