プレイヤーが好きなタイミングで特定のオブジェクトをクリックし、特定のシナリオラベルにJumpする方法

677 views
Skip to first unread message

田中せいや

unread,
Oct 16, 2022, 5:48:20 PM10/16/22
to 宴ユーザーグループ
宴のバージョン: 宴3.10.2
UnityのバージョンとOS: Unity2021.5.f1 Windows
Unityの習熟度:初心者。プログラムはできません。

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

掲題の件、実現したいものとして、
⓪ゲーム中でテキストが表示される。
①テキストが再生されていく
②プレイヤーが好きなタイミングでなにか特定のUIをクリックする。
③特定のシナリオラベルにJumpSubroutineでジャンプする
④EndSubroutineでジャンプ先を終了する
⑤上記⓪の次のテキストから再開する

ということを実現したいのですが、「プレイヤーが好きなタイミングで特定のオブジェクトをクリックし、特定のシナリオラベルにJumpする方法」はありますか?

試したものとしては、上記①を「SpriteコマンドでSpriteを表示してからSelectionClickでそれをArg4で指定し、シナリオラベルに飛ばす」という方法を試してみましたが、SelectionClickの処理の際にテキストの再生が止まってしまうため、そうではなく、テキストが再生されていく中で、ユーザーの好きなタイミングで特定のUIをクリックし、Jump先に飛ばしたいと思っています。
Tipsのような機能を応用すれば実現できるのかと思いましたが、スクリプトなどどう作ってよいのかわからず、なにか宴でそういった機能があればと思い、質問しました…。

プレイヤーにクリックさせる特定のUIは、Unityで独自に作ってそれをクリックさせる方法、または宴のシートに登録してなにかのコマンドで表示させ、それをクリックさせる方法があるのではないかと考えております。。

マッドネスラボ

unread,
Oct 16, 2022, 8:59:16 PM10/16/22
to 宴ユーザーグループ
宴のコマンドにはそういう機能はありません。
やるとすれば、けっこう難しいプログラムを書く必要があります。

⓪~②までであれば、プログラムを書けばわりと簡単にできます。
>プレイヤーにクリックさせる特定のUIは、Unityで独自に作ってそれをクリックさせる方法
この方法で、あらかじめシーン内にボタンなどを作っておいて、そのボタンが押されたら、プログラムからAdvEngineのJumpScenarioを呼び出すというやり方が良いかと思います。

ただ、問題は③~⑤です。
>上記⓪の次のテキストから再開する
というときに「それまでに表示していたキャラクター表示や背景。再生していたBGM等」はどうするのかというものです。
ジャンプ先から本シナリオに戻ったときに
 ・その1 ジャンプ先で変化した状態のままにする
 ・その2 ジャンプ先で変化した状態はリセットし、本シナリオをジャンプ前に中断した状態に戻す
このどちをするかで違います。
ちなみに「 JumpSubroutine 」コマンドが行うのは「その1」ですが、コマンドを使わずにプログラム上で同様のことをするのは宴のソースコードの改変が必要です。

「その1」であれば、
・プログラム上で、ジャンプ前にあらかじめシナリオラベルとページ番号を残しておく
・宴のソースコード自体を改変して「シナリオラベルとページ番号を渡して次のページを再生する」機能を追加する
ということが必要になります。

「その2」であれば、
・プログラム上で、ジャンプ前にあらかじめ再開用のセーブデータ(次のページで再開するなら、あらかじめ強制的に改ページしてから)をメモリ上に残す
・再開するタイミングでそのセーブデータで 再開する。
ということが必要になります。


2022年10月17日月曜日 6:48:20 UTC+9 chanshi...@gmail.com:

田中せいや

unread,
Oct 17, 2022, 2:04:46 AM10/17/22
to 宴ユーザーグループ
ご返信いただき誠にありがとうございます。

上記の件、かしこまりました。
>あらかじめシーン内にボタンなどを作っておいて、そのボタンが押されたら、プログラムからAdvEngineのJumpScenarioを呼び出すというやり方
こちらをやってみようと思っているのですが、どちらかに似たようなサンプルはございますか?
SendMessageコマンド を使ったことはある(UnityでReceiveMessageという空のオブジェクトを作ってそれに「宴のパラメータを取得して指定したテキストの表示をその数値に変える」というスクリプトを張り付けて宴でSendMessageコマンドを使ったことがある)のですが、「ボタンを押して、JumpScenarioを呼び出す」ということは迷っております…。



2022年10月17日月曜日 9:59:16 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Oct 17, 2022, 1:25:08 PM10/17/22
to 宴ユーザーグループ
AdvEngineにJumpScenarioというメソッドがあるので、それを呼び出すだけです。

簡単なサンプルとしては、次のようになります。
 public class SampleAdvEngineController : MonoBehaviour
 {
        // ADVエンジン
        public AdvEngine AdvEngine { get { return advEngine; } }
        [SerializeField]
        protected AdvEngine advEngine;
 
        //指定のラベルのシナリオを再生する
        public void JumpScenario(string label)
        {
            AdvEngine.JumpScenario(label);
        }
}

こちらも参考にどうぞ。


ただ、これはあくまで「新しいシナリオを呼び出す」だけです。
呼び出す前の本シナリオをいったん中断したり復帰後に再開する・・・といった処理は上記のサンプルには含まれていませんし、
すでにお伝えしたように、やる内容によっては現状の宴のソースコードを改変しない限りは不可能だと思います。

 
2022年10月17日月曜日 15:04:46 UTC+9 chanshi...@gmail.com:

田中せいや

unread,
Oct 18, 2022, 3:35:55 AM10/18/22
to 宴ユーザーグループ
ご返信いただきありがとうございます。

「新しいシナリオを呼び出す」となると、確かにいろいろと複雑になってしまいそうですね…。
「プレイヤーが好きなタイミングでJumpSubroutineを引き出せる」ようになれば、ゲーム商品としての価値も更に上がると思いましたが、
今回は別の方法を模索してみようと思います。

もし今後、宴のアップデートなど予定されておりましたら、
有料でも構いませんので、上記の機能の搭載を一考いただけると、宴を重宝しておりますゆえ、私は非常に助かります…。

以上です。

2022年10月18日火曜日 2:25:08 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Oct 18, 2022, 3:31:14 PM10/18/22
to 宴ユーザーグループ
了解しました。
すぐには難しくお約束できないのですが、検討してみます。

ちなみに、用途としてはどんなイメージでしょうか?

よくあるのは、「本シナリオとは別のサブシナリオ的なものを再生する」というもので、
例としては、TIPSや図鑑、用語辞書などにあたると思います。
機能としては、次のようなものになります。
・本シナリオはいったん中断。非表示にするか、背景に継続して表示。
・サブシナリオを本シナリオとは別の表示レイヤーで再生
・サブシナリオの終了後、それらで起きた変化はリセットし、本シナリオを再開
これは、どちらかというとサンプルプログラムや、各種の設定のドキュメントが必要になると思います。

ただ、JumpSubroutineコマンドと同様のものとなると、
本シナリオの表示は継続し、サブシナリオでその表示を変化させていって、サブルーチン内で変化したBGMや背景表示は、サブルーチン終了後も元に戻さないという形になります。
この場合は、プログラムの改変は最小限ですむのですが、私の方であまり用途をイメージできないので、必要ないなら特に実装をしない予定です。
もし、こちらの方が必要であれば、どういう目的で使うかを教えていただけるでしょうか?


2022年10月18日火曜日 16:35:55 UTC+9 chanshi...@gmail.com:

田中せいや

unread,
Oct 19, 2022, 2:45:53 AM10/19/22
to 宴ユーザーグループ
考えていた用途としましては、
「JumpSubroutine先に『プレイヤーがリソースとして与えられているワンセット』を明確に作ってしまい、それを好きなタイミングでプレイヤーがアクセスし、発想できる」というイメージでいます。

『プレイヤーがリソースとして与えられているワンセット』というのは、たとえば「殴る」「魔法を使う」などのインタラクティブなコマンドを想定しています。(コマンドの中に「もどる」という なにもせずにシナリオに復帰する コマンドがあるということも想定しているが故に「JumpSubroutine」で移動することを想定していました)
JumpSubroutine先にSelectionコマンドで「殴る」「魔法を使う」などのコマンドリストを作り、プレイヤーがその中からなにかのコマンドを選ぶと、SelectionによってJumpしたシナリオラベル先で「殴る演出(テキストやサウンド)が入る」→「相手のリアクションが決まる処理(Param計算)が走る」→「対象が~状態になる (リアクションが決まる) 」→「その状態によっては、殴ったことを許してもらえて少しセリフが走った後に元のシナリオに復帰することもあれば、そのまま殴り合いになって別のシナリオ展開が始まることもある、また相手のHPによっては死亡状態になり別のシナリオ展開が始まることもある」ということでした。
(上記の通り、会話中の目の前のキャラを殴って死亡させた場合などには、最終的にはSubroutineで帰ってくるのではなく、違うシナリオの方にJumpさせないといけないので、もしかしたらやらないといけないことは、「プレイヤーの好きなタイミングでJumpSubroutine」ではなく 「プレイヤーの好きなタイミングでJump」 なのでは?とも思いました。しかしその場合、「もどる」コマンドや「元のシナリオに復帰するパターン」はどうすればいいのか、という感じです…)

「好きなタイミングで」というところにこだわる理由としては、
「製作者側でSelectionを設けた時(=シナリオの流れる時間を止めた時)だけ、コマンドにアクセスしてキャラを殴れる」というものではなく「会話の最中(=時間が流れている中)でプレイヤーが殴りたいと思った時にいつでも殴れる」という自由を与えることで、
制作者側でも想定していなかった攻略方法が生まれる(「このタイミングでこのキャラを殴って死亡させると、予想外なロジックでこのイベントが回避できてしまう」などの)隙間が生じたり(=ゲーム攻略の幅が広がったり)、プレイヤーの気持ち的にも好きな時に好きなことをできるという意味で「やらされてる感」を減らせるのではと思いました。
またノベルゲーム全体の弱点である「時間の流れのコントロールが製作者側にある」といった製作者主導な感じが少し解決でき、プレイヤーに主体性を持たせられる=ゲームとしての性質が高まるのかな、という狙いです。

用途としては以上になります。
「プレイヤーが好きなタイミングでJump(Jumpコマンドと同様なものが)できるように」と考えると、プログラムの改変は最小限で済みそうでしょうか?ただその場合、「もどる」コマンドや「元のシナリオに復帰するパターン」はどうすればいいでしょうか…。
好きなタイミングでJump(or JumpSubroutine)する → 表示中のキャラクター表示や背景。再生していたBGM等は一時的に全てオフにして保持しておく → コマンド選択をする → (「もどる」場合はシナリオに復帰する)もどる以外のコマンドの場合は、SelectionのJumpの先に進める → コマンド終了後に復帰する場合もあれば、新しいシナリオになることもある

と考えています。困難になるでしょうか…。

2022年10月19日水曜日 4:31:14 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Oct 19, 2022, 8:39:26 PM10/19/22
to 宴ユーザーグループ
了解しました。
となるとサブルーチンではなく、
TIPSなどと同様にメインシナリオを中断してからサブシナリオを再生し、終わったらメインシナリオを再開するというものが必要なようです。

拡張したコードと、サンプルプログラムを追加しましたので、
宴の最新版にアップデートしたのち、添付のパッケージファイルを適用してください。
(添付ファイルのダウンロード後に、拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)


パッケージを適用すると、Utage\Sample\Scripts\SampleSubScenario.cs というサンプルプログラムが追加されます。
この中に、サブシナリオの再生などのサンプルプログラムが記述されています。

シーン内にこのコンポーネントをAddComponentして必要に応じて呼び出してください。

下記は、サブシナリオ再生用のボタンを追加し、それがクリックされたときに
「SubScenario1」というシナリオラベルのサブシナリオが呼ばれるようにする設定の例です。

ss_0537.png
ss_0535.png


サブシナリオの書き方はこんな感じです。
基本的には、通常の宴のシナリオの書き方と同じで、
EndScenarioコマンドに来た時点で、サブシナリオを終了しメインシナリオが再開されます。

ss_0536.png

>最終的にはSubroutineで帰ってくるのではなく、違うシナリオの方にJumpさせないといけない
これをしたいときは、SampleSubScenarioのCancelResumeMainScenarioメソッドを呼び必要があります。
●コマンドのサンプル
(上記の「***メインシナリオとして分岐」の部分)
 SendMessageByName    SbuScenarioButton    CancelResumeMainScenario
簡易的にSendMessageByName    コマンドを使って呼び出せるようにしています。
(プログラムを拡張すれば、用途に合わせてSendMessageコマンドやカスタムコマンドで呼び出すこともできます)


注意点
・メインシナリオに戻る場合は、メインシナリオ中断時のセーブデータを利用しています。
 つまり、中断した時点のページの冒頭から再生されます。(次のページではありません)

・最初からセーブを無効化していたりセーブポイント方式を使う設定に変えている場合
 再開用のセーブデータが作れませんのでこの手法は使えません。

・サブシナリオ中はセーブが無効化されます。
 その間はセーブ画面を開かないようにするなど、UIの調整が必要になると思います。

SampleSubScenario.csはサンプルなので、それを元にしたコンポーネントを自作してUIのオンオフなど細かい調整を加えるなどしていってください。


2022年10月19日水曜日 15:45:53 UTC+9 chanshi...@gmail.com:
SampleSubScenario.unitypackage

田中せいや

unread,
Oct 20, 2022, 8:11:28 AM10/20/22
to 宴ユーザーグループ
上記、誠にありがとうございます…。
こちらの手順にて無事、希望していたことが実現できました…!

一応、その過程にて発見できた個人的に予想外だった現象としましては、
「上記画像の『SbuScenarioButton』にあたるオブジェクトが、ジャンプ先のサブシナリオでGuiActiveコマンドによりFALSEとしてオフになっている状態で『EndScenario』を実行すると、メインシナリオに復帰せずにタイトル画面に戻されてしまう」という現象は確認しましたが、
私の方では「SbuScenarioButton」にあたるオブジェクトをオンにしたまま使っていこうと思っておりますので、全く問題になりませんでした。(私はコードの内容が詳しく理解できないので、もしかしたら想定内の現象であったかもしれません)

この度はご返答いただき誠にありがとうございます…この宴は私にとっては控えめに言っても神でございます…。

以上です。

2022年10月20日木曜日 9:39:26 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Oct 20, 2022, 6:46:08 PM10/20/22
to 宴ユーザーグループ
> ジャンプ先のサブシナリオでGuiActiveコマンドによりFALSEとしてオフになっている状態で『EndScenario』を実行すると
すみません。オフになると、コルーチンがSampleSubScenario.csコンポーネント内の待機処理(コルーチン)も停止してしまうので、オフにならないGameObectにAddComponentする必要があります。
SampleSubScenarioをAddComponentする対象を、ボタンではなくAdvEngineなどオフにならない別のオブジェクトに変えてください。
合わせてボタンのOnClickで登録するGameObjectや、SendMessageByName  の Arg1 で指定する名前を、新しいオブジェクト名に変えてください。

2022年10月20日木曜日 21:11:28 UTC+9 chanshi...@gmail.com:
Message has been deleted

田中せいや

unread,
Dec 13, 2022, 12:24:31 PM12/13/22
to 宴ユーザーグループ
お世話になっております。
上記内容の延長となる質問となると感じましたので、こちらに投稿いたしました。

先日、上記やり取りにてシナリオ再生中に「好きなタイミングでJump(or JumpSubroutine)する → 表示中のキャラクター表示や背景。再生していたBGM等は一時的に全てオフにして保持しておく → コマンド選択をする → (「もどる」場合はシナリオに復帰する)もどる以外のコマンドの場合は、SelectionのJumpの先に進める → コマンド終了後に復帰する場合もあれば、新しいシナリオになることもある」

というものを実現可能かどうか質問いたしましたが、
こちら、「表示中のキャラクター表示や背景。再生していたBGM等は一時的に全てオフにして保持しておく」
の部分を「表示中のキャラクター表示や背景、再生していたBGM等は一時的に保持しておき、背景に表示しておく(オフにしない)」
とすることは最小限のプログラムの改変で可能でしょうか?
「もどる」以外のコマンドを選択した場合に保持していた背景などは全てオフにし、新たにCharacterコマンドやBgコマンドにより表示しなおせる (Jumpの先に進める)  ようなものを考えております。
2022年10月21日金曜日 7:46:08 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Dec 13, 2022, 7:50:48 PM12/13/22
to 宴ユーザーグループ
はい。可能です。

先日のサンプルをもとに、 サブシナリオの再生はこちらのドキュメントにもまとめましたので、このドキュメントをベースに説明いたします。

現在再生していた背景等をオフにするのは、
SampleSubScenario.csの 63行目の

        //今の表示等をクリア
        AdvEngine.ClearOnEnd();

という部分でやっています。これをしなければ現在の状態を継続したままになります。
すべての場合でクリアしないならコメントアウトすれば良いですが、
場合によってオフにしたりオンにしたり使い分けたい場合は。

public bool IsClearOnStartSubScenario {get; set;}
などの、オンオフできるフラグを追加して、

        //今の表示等をクリア
if(IsClearOnStartSubScenario)
{
        AdvEngine.ClearOnEnd();
}

というようにif文で分岐してください。
あとは、IsClearOnStartSubScenarioのオンオフするプログラムを
JumpSubScenarioのプログラムを呼び出す前に書けばよいです。



2022年12月14日水曜日 2:24:31 UTC+9 chanshi...@gmail.com:

田中せいや

unread,
Dec 14, 2022, 4:03:51 AM12/14/22
to 宴ユーザーグループ
ご返信いただきありがとうございます。

「すべての場合でクリアしない」という方向で運用していきたいと思い、63行目の
AdvEngine.ClearOnEnd();
をコメントアウトして使用してみましたが、

想定した挙動としてはこれまでのように「背景などは表示したまま、すぐにコマンド選択画面(Selection画面)に移動する」というものなのですが、
現在、「MessageWindowに表示されたテキストをひとつ送ってから、コマンド画面(Selection画面)に移動する」という挙動になっております。
こちら、なにか別の要因がありそうでしょうか?それとも、  AdvEngine.ClearOnEnd();  をコメントアウトする以外に編集することがあるでしょうか?

2022年12月14日水曜日 9:50:48 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Dec 14, 2022, 5:31:17 AM12/14/22
to 宴ユーザーグループ
すみません。
現在のシナリオをクリアしていない場合は、JumpScenarioは改ページのタイミングにしかできませんでした。


改ページ待機中に呼び出す前提であれば、
下記のように、AdvEngine.Page.InputSendMessage(); を呼べば、プログラム上でクリック入力したのと同じ扱いになって改ページしてからJumpScenarioができます。

        if (IsClearOnStartSubScenario)
        {
         //今の表示等をクリア
            AdvEngine.ClearOnEnd();
        }
        else
        {
            AdvEngine.Page.InputSendMessage();
        }

改ページ待ちかどうかは、AdvEngine.Page.IsWaitBrPage で取得できるので
サブシナリオを起動するボタンのオンオフを制御するコンポーネントを追加して、次のようなコードを書けば、改ページ待機中以外はボタンを表示させないなどしてください。

    public GameObject button;
    void Update()
    {
        button.SetActive(AdvEngine.Page.IsWaitBrPage);
    }


ただ、改ページ待機中以外のタイミングでも呼ぼうとするとなると、難しいです。
というのも、各コマンドの途中で処理を割り込ませるとなると、実行していたコマンドや実行予定だったコマンドをどうするのか、というのが制御できなくなってしまうからです。

やるとすれば、
〇パターン1 現在実行中のページのすべてのコマンドをプログラム上でスキップして、強制改ページ
 →プログラムからはスキップできないコマンドがあるので、現状では不可能
〇パターン2 現在の実行中のコマンドを強制的に停止して、強制ジャンプ
 →現状そういった機能がないのと、演出の途中のものなどは中途半端に止まってしまうものもあれば、演出が継続したまま止められなくなるものもでてくる可能性もあるので、実装してもおそらく破綻する。

ということになります。


2022年12月14日水曜日 18:03:51 UTC+9 chanshi...@gmail.com:

田中せいや

unread,
Dec 15, 2022, 2:54:39 AM12/15/22
to 宴ユーザーグループ
ご返信いただきありがとうございます。
上記、かしこまりました。
これから手を入れようとしますと、なかなか複雑になってしまいそうな印象を受けました。

ひとまず、これまでと同じように「背景などは一度クリアする」という方向で、良い方法がないか、進めてみようと存じます。
ご回答いただきまして誠にありがとうございます。
2022年12月14日水曜日 19:31:17 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages