一つのUIから、再生中のラベルに応じて複数のラベルにジャンプしたい

250 views
Skip to first unread message

ニコ

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

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

現在、会話中にプレイヤーが任意で話題を広げることで
会話の内容が変化するシステムを実装したいと考えております。

大まかな形としましては、
基本的にはA→B→Cとシームレスに話題が進行し、そのまま続けるとDへ。
この最中に「話題を広げる」ボタンを押した場合、
A中に押す→Eに分岐
B中に押す→Fに分岐
C中に押す→Gに分岐
というように、プレイヤーがボタンを押すタイミングに応じて
シナリオが分岐するというものです。

話題の切れ目やタイミングはラベルで区切ることを考えており、
・Unityの方でUIを作り、そこからジャンプシナリオを呼び出す
・UIから特定のラベルに飛ぶ
ところまではマニュアルを拝見し実装できました。
これに加えて、現在再生中のラベルに応じて
ジャンプ先のラベルを変更することは可能でしょうか?

また、他にもっと効率的な方法がある場合は、
その方法についてお教えいただけますと幸いです。

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

マッドネスラボ

unread,
Jul 1, 2025, 7:08:40 PM7/1/25
to 宴ユーザーグループ
>現在再生中のラベルに応じて
>ジャンプ先のラベルを変更することは可能でしょうか?

アプローチの仕方としては、2種類あります。

1.パラメーターを使って、ジャンプ先のシナリオラベルを変更する
    • Paramシートに、ジャンプ先のラベル名として使用するString型のパラメーターを追加(仮にJumpLabelとします)
    • A→B→Cのシナリオが開始したときに、Paramコマンドを使ってパラメーター(JumpLabel)の内容を、ジャンプしたいシナリオラベル名に変更
      • 例)
        • Param  JumpLabel "E"
    • ジャンプシナリオを呼び出すプログラムで、GetParameterString("JumpLabel")を使ってJumpLabelの内容を取得して、それをジャンプ先にする
      • 例)
        • var jumpLabel   = engine.Param.GetParameterString("JumpLabel");
        • JumpScenario(jumpLabel);
この方法であれば、プログラムやUnity上の値を変更することなく、シナリオを書く側でジャンプ先を調整可能です。
ただし、シナリオ上でジャンプ先のシナリオラベルの変更を忘れるてしまうというミスが起きがちかもしれません。

参考 
プログラムからパラメーターを呼び出すには https://madnesslabo.net/utage/?page_id=1715#Unity



2.プログラム上で現在のシナリオラベルに応じて、ジャンプ先のシナリオラベルを変える

        AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing( ref engine );
        [SerializeField] AdvEngine engine;

        AdvScenarioThread MainThread => Engine.ScenarioPlayer.MainThread;


        void Sample()
        {
                //現在のシナリオラベルを取得
                var currentScenarioLabel = MainThread.CurrentLabelData.ScenarioLabel;

              //シナリオラベルによって、ジャンプ先のラベル名を変更するプログラムを書く(省略


        }

元のシナリオラベルの命名規則に従ってジャンプ先を変えたり、ジャンプ先をランダムに変えたり、他のパラメーターに連動して細かく変更したい場合、
プログラムでそれに応じた細かい処理を書けるので、こちらの方が実装しやすいと思います。
ただ、プログラムを変更しないと制御しづらくなってしまうので、その点で問題が出てくるかもしれません。
その場合は、インスペクターなどで、今のシナリラベルとジャンプ先のシナリオラベルの対応データや、必要な変数(ランダムの重みづけなど)を追加設定可能な形で実装すれば、Unity上のインスペクターの値を変えるだけで済むようにもなります。

1の方向で実装するほうが楽だと思いますが、それでは実装できない複雑さが必要なのであれば2の方向を試してみてください。



2025年7月1日火曜日 23:58:56 UTC+9 ニコ:

ニコ

unread,
Jul 5, 2025, 7:37:05 AM7/5/25
to 宴ユーザーグループ
アプローチについて、2種類教えていただきありがとうございます。
想定しているシステムの簡易さからしても自分のプログラムへの理解度からしても、
アプローチ1で十分想定した動きができそうです。

アプローチ1を実装するにあたり、
「ジャンプシナリオを呼び出すプログラムで、GetParameterString("JumpLabel")を使ってJumpLabelの内容を取得して、それをジャンプ先にする」
という工程で躓いているため、
大変申し訳ないのですが重ねて初歩的な質問をさせてください。

当初の質問で申し上げた
「Unityの方でUIを作り、そこからジャンプシナリオを呼び出し特定のラベルへ飛ぶことまではできた」という点について、
詳しくは「会話シーンとして宴を使う」を参考にSampleAdvEngineControllerをbuttonにコンポーネントし、
クリック時に特定のラベルへ遷移すること、
つまりサイトに書かれていることをそのままなぞることまではできたという段階でした。

ここからさらにお教えいただいたアプローチ1を実現するにあたっては、
・リンク先「Param」内の「Unityのプログラムから、宴のパラメーターを操作する」のサンプルをSampleAdvEngineControllerに追記する
・SampleAdvEngineControllerの「//指定のラベルのシナリオを再生する」部分をお教えいただいた例文に書き換える
といった方法をとるということで合っておりますか?

初歩的かつ私のUnityの習熟度の問題で大変恐縮ですが、ご教示頂けますと幸いです。

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

2025年7月2日水曜日 8:08:40 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jul 5, 2025, 8:21:54 PM7/5/25
to 宴ユーザーグループ

>リンク先「Param」内の「Unityのプログラムから、宴のパラメーターを操作する」のサンプルをSampleAdvEngineControllerに追記する
はい。そうなります。
Parmシートに追加したパラメーター名が「JumpLabel」の場合、
次のような形になります。

//JumpLabelパラメーターの値を取得
public string GetJumpParam()
{
return AdvEngine.Param.GetParameterString("JumpLabel");
}

>SampleAdvEngineControllerの「//指定のラベルのシナリオを再生する」部分をお教えいただいた例文に書き換える
これは、書き換えてしまうと、常にParam内の値を使ってジャンプするようになってしまうので
下記のようにパラメーターを使ったジャンプをするという別のプログラムを書いてそれを呼び出す形にしたほうが、
使いやすくなると思います。


//パラメーターの値のラベルにシナリオをジャンプする
public void JumpScenarioToJumpParam()
{
var label = GetJumpParam();
JumpScenario(label);
}



2025年7月5日土曜日 20:37:05 UTC+9 ニコ:

ニコ

unread,
Jul 7, 2025, 1:05:26 PM7/7/25
to 宴ユーザーグループ
教えていただいたプログラムで想定していた動きができました!
利便性の面も考慮してくださり、本当にありがとうございます。
感謝の気持ちで胸がいっぱいです。



念のため、今後私と同じレベル帯もしくは同じお悩みの方が見たとき用に、
今回のParamの記入内容を具体的に記しておきます。

・Paramシート
Label・・・任意の名称(私の場合は教えていただいたとおりに「JumpLabel」)
Type・・・String
ValueとFileTypeはたぶん空欄でOK

・シナリオシート
Command・・・Param
Arg1・・・ParamシートのLabelで設定した名称="ジャンプ先のシナリオラベル名"
    (私の場合は「JumpLabel="ほにゃらら"」)
2025年7月6日日曜日 9:21:54 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages