会話シーンでの使用におけるコンフィグ機能について

224 views
Skip to first unread message

Yuri Takigawa

unread,
Jan 20, 2022, 4:35:43 AM1/20/22
to 宴ユーザーグループ
宴のバージョン: 宴3.11.2
UnityのバージョンとOS: Unity2020.3.26f1 Windows10宴のバージョン: 宴3.11.1
UnityのバージョンとOS: Unity2020.3.22f1 Windows10
Unityの習熟度:1年未満
Unityの習熟度:ほぼ独学で1年ぐらい

お世話になっております。
ADVゲームを制作中で、宴を会話シーンとして使用しています。

お尋ねしたいことは表題どおりです。

リファレンスやQ&Aを拝見し、会話シーンなどでGUIをいじるときは自作でスクリプトを書く必要があることは理解しました。
そこで#UtageGuiConfigを見てみたところ、ADVエンジンをアタッチする必要があるのかな?と思ったのですが、作りたい機能としましては、一般的なアプリゲームのように、
例えばマイページにゲームの設定画面があり、そこから音量や文字送りのスピードなどをいじるようなものを想定しています。
なので、Utageを導入しているシーンではない別のシーンにスクリプトをアタッチする必要があると考えているのですがそうするとADVエンジンを実装できないので会話シーンに設定を反映できないのではないかと思い、ドツボにハマってしまいました。

わかっていないことが多いので書かれているスクリプトをきちんと読み取れていないと思うのですが、別のシーンから会話シーンの設定ができるのか、できるのであればどういうスクリプトを書くべきなのか教えていただけると非常にありがたいです。

ちなみにGameManagerSceneを常駐させ、各シーンを加算、アンロードで切り替える方法を実装しております。

マッドネスラボ

unread,
Jan 20, 2022, 10:25:21 AM1/20/22
to 宴ユーザーグループ
UtageGuiConfig.csのAdvEngineのソースコードは次のようになっています。

        public AdvEngine Engine { get { return this.GetComponentCacheFindIfMissing(ref this.engine); } }
        [SerializeField]
        protected AdvEngine engine;

GetComponentCacheFindIfMissingは、AdvEngineが設定されていなかったらFindして取得するというものです。
なので、このパターンであればそのまま使えると思います。
>ちなみにGameManagerSceneを常駐させ、各シーンを加算、アンロードで切り替える方法を実装しております。

>別のシーンから会話シーンの設定ができるのか、できるのであればどういうスクリプトを書くべきなのか教えていただけると非常にありがたいです。
GameManagerSceneに、次のようなGameManagerのシングルトンコンポーネントを設定し、

public class GameManager : SingletonMonoBehaviour<GameManager>
{
       public AdvEngine Engine { get { return this.GetComponentCacheFindIfMissing(ref this.engine); } }
        [SerializeField]
        protected AdvEngine engine;
}

他のシーンからは、このようにして、シングルトン経由でアクセスすればいいだけです。
var engine = GameManager.Instance.AdvEngine;
ただし(当然ですが)GameManagerSceneのロードが終わる前にアクセスをしたりすることはできないです。
なので、他のシーンが先のロードされるケースがある場合、特にAwake時などに呼び出すのはやめたほうがいいです。

この辺は、Unityのシーン管理とプロジェクトの設計方針しだいになります。
一応知る限りはまとめましたが、Unityの使い方のほうの問題になります。

2022年1月20日木曜日 18:35:43 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Jan 25, 2022, 9:43:15 PM1/25/22
to 宴ユーザーグループ
お世話になっております。
いつもご丁寧に回答してくださり、誠にありがとうございます。

シングルトンを使う方法ですが、エラーが出てしまい私では解決できそうにないのでお力添えいただければ幸いです。

シングルトン用の抽象クラスと、それを継承するシングルトン化するクラスは作れたのですが、
public AdvEngine Engine { get { return this.GetComponentCacheFindIfMissing(ref this.engine); } }
        [SerializeField]
        protected AdvEngine engine;
上記のAdvEngineが存在しないと赤波線が出てしまい、途方に暮れております。

プロジェクトの構成としては
ConfigScene(ゲームの設定をする画面)
GameManagerScene(常駐しているシーン・表からは見えない)
UtageScene(宴がAdd to Current Sceneされているシーン・シナリオ再生時に呼び出される)
こういうものを想定しています。

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

2022年1月21日金曜日 0:25:21 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jan 25, 2022, 11:53:13 PM1/25/22
to 宴ユーザーグループ
プログラムの冒頭に以下のように書いてください。
using Utage;
using UtageExtensions;

C#でプログラムをする場合には、名前の衝突を避けるためにネームスペースというを利用します。
ネームスペースとは、わかりやすくイメージで言うと「どの地方の方言か」みたいなものです。
AdvEngineは、フルの呼び出し方は、Utage.AdvEngine になります。
冒頭に using Utage; としておくことで
Utage.部分を省略して、AdvEngine だけで呼び出されるようになります。
つまり、方言のイメージでいうと「Utage地方の方言を使うと書いておくことで、AdvEngineと言ったら Utage.AdvEngineを差す」という感じになります。

なので、宴の機能を使う場合には、
using Utage;
のように宴のネームスペースを書いてください。

さらに、GetComponentCacheFindIfMissing のように、宴側でUnityの基本機能を拡張している部分には、
using UtageExtensions;
が追加で必要になります。
GetComponentCacheFindIfMissingは、Unityの基本のMonobehaviorというクラスを拡張する形で実装しています。
ただ基本機能の拡張は、他のアセットや自分たちのプロジェクトでも、同じようにUnityの基本機能を拡張することがあります。
なので、衝突を避けるために、ネームスペースをわけています。
(ほかの地方でも似たような別の意味の言葉が使われやすいので、あえて別にしてるみたいなイメージです)

2022年1月26日水曜日 11:43:15 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Jan 26, 2022, 4:18:36 AM1/26/22
to 宴ユーザーグループ
ありがとうございます!
おかげさまで該当部分のエラーは解消しました。

ただ、実装して実行したところ、AdvEngineがないとインスペクター上で表示されてしまいます。

シナリオは再生されているのでADVエンジンがないわけはないと思うのですが……

2022-01-26.png

2022年1月26日水曜日 13:53:13 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jan 26, 2022, 6:16:22 AM1/26/22
to 宴ユーザーグループ
GetComponentCacheFindIfMissing  は
AdvEngineが設定されていなかったら、ロード済みの全シーンから探してもってくるものなので、使えているならそれで大丈夫です。
同一シーン内にAdvEngineがあるならあらかじめ設定しておいたほうが良いですが、
別シーンの場合は AdvEngineが実際に使用されるときに別シーンから探して設定します。そのときに、「なし」ではなくなると思います。


2022年1月26日水曜日 18:18:36 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Jan 26, 2022, 9:48:15 PM1/26/22
to 宴ユーザーグループ
スクリーンショットの画像は、シナリオ再生中に撮ったものなのでAdvEngineが使用されていると思うのですが違うのでしょうか?

2022年1月26日水曜日 20:16:22 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Jan 27, 2022, 1:26:27 AM1/27/22
to 宴ユーザーグループ
すみません、ちょっとそこまではわからないです。

シナリオ再生中というか、該当する
       public AdvEngine Engine { get { return this.GetComponentCacheFindIfMissing(ref this.engine); } }
を呼び出したタイミング以降から、AdvEngineが設定されます。
別のプログラム経由でAdvEngineを再生したとしても、上記のプログラムを呼び出すわけではないので、AdvEngineは設定されないままです。


また、Unityのインスペクターの表示は、基本的には同じシーンのオブジェクトを設定するためのものなので、
今回のように、実行中に他のシーンのオブジェクトを設定した場合にどう表示されるかは、Unityのバージョンなどのよって違うのかもしれません。
ただ、ゲーム実行中であれば、知る限りは表示されるはずです。
エディタ拡張などで、ゲーム実行中ではなくマルチシーン編集しているときに、他のシーンのオブジェクトを設定すると、なんらかのエラーメッセージが出たと思います。
インスペクターの表示は、Unityの仕様次第なので、
正確に知りたい場合は、プログラム用のデバッガを使ったり、Debug.Logなどで状態を書き出すプログラムを書いたほうが確実です。







2022年1月27日木曜日 11:48:15 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Jan 27, 2022, 2:09:50 AM1/27/22
to 宴ユーザーグループ
わかりました!
Unityの仕様のことまでありがとうございます!
もう少し自力で頑張ってみようと思います!

2022年1月27日木曜日 15:26:27 UTC+9 マッドネスラボ:

Yuri Takigawa

unread,
Jan 31, 2022, 6:42:02 AM1/31/22
to 宴ユーザーグループ
すみません、そもそもの話なのですが、コンフィグ画面のゲームオブジェクトなどは会話シーンでプロジェクトを作ると生成されないのでしょうか?


2022年1月27日木曜日 16:09:50 UTC+9 Yuri Takigawa:

マッドネスラボ

unread,
Jan 31, 2022, 6:57:59 AM1/31/22
to 宴ユーザーグループ
はい。そうなります。
必要であれば、テンプレートシーンやサンプルからコピペするなどしてもってきてください。
テクスチャやSEは、テンプレートやサンプルのままになってしまうので、そこはオリジナルのものに差し替えてください。



2022年1月31日月曜日 20:42:02 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Jan 31, 2022, 9:21:19 PM1/31/22
to 宴ユーザーグループ
ありがとうございます!

2022年1月31日月曜日 20:57:59 UTC+9 マッドネスラボ:

Yuri Takigawa

unread,
Feb 24, 2022, 2:42:41 AM2/24/22
to 宴ユーザーグループ
オート機能について新たにわからないことが出てきたため、お尋ねいたします。

オートボタンを新たにつくり、オート機能をつけることは問題なく成功いたしました。
また、オート機能はEndScenario後も続行したいため、画像のEngine.Config.isSkip = false;のように、
Clear()内ではリセットしないようにしているのですが、

問題は、ゲーム自体の再生時にオート機能をつけたままゲームを終了させると、
ふたたび再生した際に、オートしてしまうことです。
オートしているだけならそういう仕様ということでいいのですが、
オート時にはオート機能が起動していることがわかるようにボタンを灰色にしており、
ゲーム再生時はオートしているにも関わらず、ボタンの色が変わらないので、非常にややこしいことになっています。

また、インスペクターでAdvEngineにアタッチされているAdvConfigを確認したのですが、
オート起動時もIs Auto Br Pageにチェックがついておりませんでした。
オート機能自体は問題なく動作しているのですが、
Engine.Config.IsAutoBrPageをオンオフすることで動作させているのにそれが反映されていないので困惑しています。

1.EndScenarioでは起動し続け、ゲーム自体のオンオフでは停止するオート機能をつけることは可能でしょうか?
2.ゲーム自体のオンオフでオート機能が停止できない場合、ボタンの色を変えることは可能でしょうか?

以上2点、お手数ですが教えていただきたいです。
よろしくお願いいたします。

2022年2月1日火曜日 11:21:19 UTC+9 Yuri Takigawa:
2022-02-24.png

マッドネスラボ

unread,
Feb 24, 2022, 4:14:05 PM2/24/22
to 宴ユーザーグループ
> EndScenarioでは起動し続け、ゲーム自体のオンオフでは停止するオート機能をつけることは可能でしょうか?
これは、オート機能がシステムセーブデータにされてしまうのが原因です。
オート機能をセーブしないチェックを追加したので、これを使ってください。

AdvConfigに「Dont Save Auto」というのを追加したため、これをOnにしてください。

ss_0223.png



2022年2月24日木曜日 16:42:41 UTC+9 yuri.tak...@gmail.com:
FixDontSaveAuto.unitypackage

Yuri Takigawa

unread,
Feb 27, 2022, 9:56:33 PM2/27/22
to 宴ユーザーグループ
ありがとうございます!
申し訳ありませんが、ダウンロードファイルをどのように導入すればいいか教えてください。


2022年2月25日金曜日 6:14:05 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Feb 28, 2022, 2:17:19 AM2/28/22
to 宴ユーザーグループ
FixDontSaveAuto.unitypackage というパッケージファイルを添付したのですが、
最近のGoogleグループの仕様なのか、FixDontSaveAuto.gz と拡張子が変わってDLされてしまうことがあるようです。(元のままの時もあります)

なので、手動で拡張子を変更して、.gz を .unitypackageに変えて、プロジェクトクトに適用してください。

ちなみに、 .unitypackageはもともgzファイルと同じでUnityが拡張子を変えて使っているだけのようです。
おそらくGoogleグループがセキュリティ的に、拡張子を変えただけの怪しいファイルをとみなして、拡張子を元にもどしてしまっているのかと思います。





2022年2月28日月曜日 11:56:33 UTC+9 yuri.tak...@gmail.com:

Yuri Takigawa

unread,
Feb 28, 2022, 11:10:33 PM2/28/22
to 宴ユーザーグループ
ありがとうございます!
期待していた挙動になりました!!
2022年2月28日月曜日 16:17:19 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages