別シーンからのParamの操作について

181 views
Skip to first unread message

優水

unread,
Apr 8, 2022, 12:54:19 PM4/8/22
to 宴ユーザーグループ

宴のバージョン: 宴3.11.3

UnityのバージョンとOS: Unity2020.3.30f1 MacOS BigSur

Unityの習熟度:初心者。サンプルを見様見真似で打ち込んでいます。


ノベルシーンを複数作成し、その間をハブになるシーンを介して行き来したいのですが、

その際Paramの操作を別シーンから行うにはどうしたら良いでしょうか?

両ノベルシーンを連動させたしかけ(シナリオAで〇〇をするとシナリオBで××が起こる、というような)を作りたいと考えています。

void FlagSample(AdvCommandSendMessage command)
{
engine.Param.SetParameter("sampleflag",true);
}

このようにシナリオA終了時にSendMessageでParamを書き換えれば良いのでは、と考えましたが、これで変化するのはシナリオAのParamで、シナリオBのParamには影響がないことに気がつきました。

そこから冒頭の質問に戻ります。

複数シーンの管理も関わってきますし、SceneManagerでどうにかなることなのかも知れませんが、(つまりUnityに関わる部分が大きいかも知れませんが)宴内のフラグを継承するため(継承と書いてはいますがParamの操作で擬似的に行えればと思います)にどうすればよいかどう調べても手がかりが掴めなかったので、質問させていただきました。

お手数をおかけしますが、よろしくお願いします。

マッドネスラボ

unread,
Apr 8, 2022, 6:04:26 PM4/8/22
to 宴ユーザーグループ
やり方としては
〇その1 AdvEngineを一つだけにする
ハブになるシーンのほうにAdvEnigneを置いて、各シーンからそれを呼び出し、再生するシナリオラベルを切り替える。
こうすればパラメーターは自然に共有できます。

〇その2 AdvEngineを複数にする
各シーンにAdvEngineを持つ。
パラメーターの共有は「シーンA→ ハブシーンー>シーンB」のようにハブシーンを介するなどする。
シーンAとシーンBを同時にロードしているなら、ハブシーンを介する必要はないですが、どのみち別シーンのAdvEngineを呼ぶ必要はあります。

基本的には、その1のほうがシンプルにできると思います。
また、AdvEngineは初期化時間がけっこうかかるので、二つのシーンに分けてロードを繰り返すと、そのたびに負荷がかかってしまいます。
Managers以下のファイルマネージャーやサウンドマネージャーは同時に複数存在できません。
なので、なるべくなら「その1」のやり方のほうが良いと思います。

別シーンのオブジェクトを呼ぶのは、SceneManagerなどを使ってください。


2022年4月9日土曜日 1:54:19 UTC+9 優水:

優水

unread,
Apr 8, 2022, 8:34:51 PM4/8/22
to 宴ユーザーグループ
迅速なご返信、ありがとうございます。
できればセーブデータを別々に管理したい、もしくはシナリオBの中断地点を呼び出せるようにしたいのですが、これは「その1」のやり方で可能でしょうか。

「その2」ではハブシーンをマネージャーシーンに持つ、という理解で大丈夫でしょうか。
その場合開始はハブシーンからになるのでしょうか。シーンAからの開始にしたい、と考えています。
また、確認なのですがSceneManagerで呼び出すオブジェクトは別シーンのAdvEngineとなるのでしょうか。

可能なら「その1」のやり方で中断地点の呼び出しをするのがいいでしょうか。
その場合、どのような実装方法が考えられるでしょうか。『宴』のシナリオラベルを中断点とすることまでは考えたのですが、その先で躓いています。

質問に次ぐ質問で申し訳ありません。
宜しければご教示いただけたら、と存じます。
2022年4月9日土曜日 7:04:26 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Apr 9, 2022, 12:21:53 AM4/9/22
to 宴ユーザーグループ
別々にセーブ(または中断、再開)となると、かなり複雑な構成になります。
その1でもその2でも可能ですが、微妙な仕様で設計が変わりますし、微妙な部分でやれないこともあったりします。
普通は起きない問題がでてきますので、それを解決する技術(プログラムの技術や、Unityのシーン管理の基本など)がないと難しいと思います。
プロジェクトの実装方法自体がとても例外的なので、細かいプロジェクトの仕様しだいで、細かい部分に関しては何とも言えないです。

>できればセーブデータを別々に管理したい
シーンAでもシーンBでセーブファイルを別にしたいというのであれば、その2でやるしかないです。

>もしくはシナリオBの中断地点を呼び出せるようにしたいのですが、これは「その1」のやり方で可能でしょうか。
シナリオAではなく、シナリオBを中断・再開するのですか?
宴には厳密な意味での中断・再開という機能はありません。
「再生中のシナリオBを中断→ シナリオAを再生 →  シナリオBの中断していたシナリオを再生」
ということをやりたいのであれば、
「再生中のシナリオBを中断→ シナリオBのセーブデータをプログラム上で保持 → シナリオAを再生 →  シナリオBの中断していたシナリオを再生(プログラム上にもっていたセーブデータを使って、シナリオBをロードして再開)」
という形になります。
AdvEngineに、
        public void WriteSaveData(AdvSaveData saveData)
        public void OpenLoadGame(AdvSaveData saveData)
というのがあるのでそれを使います。
ただし、セーブロード機能での中断・再開は「ページの冒頭から再生しなおし」になりますので、一度読んだセリフや演出が再生しなおされることになります。
それを避けたいのあれば、その1のやり方は使えません。(ですが、その2は実装が難しく複雑になると思います)

ただし、セーブデータはシシナリオAを再生前の状態になるため、シナリオAで変更させたパラメーターなどが巻き戻ってしまいます。
なので、さらにプログラム上で別にシナリオAから操作するパラメーターの影響を記録する仕組みを用意して、それをシナリオBのロード後に反映させるプログラムを書かなければいけません。


>「その2」ではハブシーンをマネージャーシーンに持つ、という理解で大丈夫でしょうか。
そうです
>その場合開始はハブシーンからになるのでしょうか。シーンAからの開始にしたい、と考えています。
ビルドしたゲームがどのシーンから開始するかは、Unityのシーン設定(Build Settings)しだいで一番最初に設定しているシーンから始まりますので、シーンAを一番上に登録すればそうなります。
Unityエディタ上でのテストプレイでは、現在編集中のシーンから始まります。

>また、確認なのですがSceneManagerで呼び出すオブジェクトは別シーンのAdvEngineとなるのでしょうか。
どこから呼び出すか次第ですが、SceneManagerは、ロード済みの別シーンにあるオブジェクトを、ほかのシーンから呼び出すのに使うものです。
同一のシーンにあるAdvEngineであれば使う必要がないです。
別のシーンにあるAdvEngineを呼び出すのであれば使う必要があります。(別のやり方もありますが、基本的には使う必要があります)

>可能なら「その1」のやり方で中断地点の呼び出しをするのがいいでしょうか。
正直なんともいえません。
パラメーターの受け渡しはそんなに難しくないのですが、問題になるのはむしろ「中断して再開」のほうです。
Unityは「中断して再開する」という仕組みが用意されていません。
なので、宴にも基本的にはそのやり方がないです。
その1をやった場合はセーブロードを使うしかないです。この場合は上記の「ページの冒頭から再生しなおし」という問題が解決できません。
その2のやり方をした場合は、中断時にいったんシナリオを止める必要があるのですが、その仕組みは用意していないため、あれこれプログラムする必要がでてきます。


2022年4月9日土曜日 9:34:51 UTC+9 優水:

優水

unread,
Apr 9, 2022, 1:56:38 AM4/9/22
to 宴ユーザーグループ
ありがとうございます。
中断といってもページの冒頭からの再生し直しは避けられないと考えていたので、
       public void WriteSaveData(AdvSaveData saveData)
        public void OpenLoadGame(AdvSaveData saveData)
を使用したその1の実装を検討します。
様々な方法を提示していただき助かりました。
重ねて、ありがとうございました。

2022年4月9日土曜日 13:21:53 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages