初回起動時のみ言語選択を尋ねるときのプログラム拡張について

204 views
Skip to first unread message

Shunpei

unread,
Jul 5, 2022, 1:36:36 AM7/5/22
to 宴ユーザーグループ
C#経験 入門書の内容が理解してそのレベルでいじれる程度
Unity 経験 1年ほど

マッドネスラボ様

お世話になっております。
半年ほど前に「本編セリフ中でキャラクターの表情演出を変える方法」「システムボタンにBGMと鳴らす方法」
について教えていただけまして、あれから無事ゲームを一通り完成させることができました。

今回、Steam、Apple、Andoroidを契約いたしまして(switchとps4もこれから契約します)、ローカライズも完了しましたので、これから製品を登録しようと考えております。
コンフィグ画面にchange languageのボタンを公式HPを参考に実装しましたので、デフォルトを英語にして、日本人にはコンフィグで変更してもらおうと当初考えたのですが、
しかし初回起動時に言語を尋ねるUIを実装して設定できたら便利だと思い、今実装を試みているところです。
今回、それに関してご質問をさせていただければと思います。

具体的にはブランドロゴなどが立ち上がった後、タイトルUIへ移る前に、
AutoSaveDataが存在しなければ、タイトルUIに移る前に、
Uguiviewを継承して作った言語を選択してくださいUIへ移動させようと考えております。

そこで宴のプログラムを調べたところ、
UtageUguiBoot.csの

///最初の画面なので自分でオープンする
    public virtual void Start()
    {
        title.gameObject.SetActive(false);
        StartCoroutine(CoUpdate());
    }

のStartCoroutine(CoUpdate())
の前に

if(!AdvSaveManager.isAutoSave)
{
       LanguageCheck.Open() ←これはLanguageCheckクラスを作って自分で実装します

}

で、実現ができるかなと考えまして、
実際にこのプログラムを記述してみたところ、
AdSaveManagerクラスのisAutoSaveメソッドついて、inaccessibleとエラーが出まして判定として用いることができませんでした。
おそらく、エラーを見る感じではアクセス修飾子の範囲の問題かと存じますが、不用意にAdvSavemanagerクラスを変更しない方がよいのではないかと思い、変更の仕方について質問をさせていただければと存じます。
また、この方法、if文を挟む場所としてここに入れることで、そもそも原理上実現したいことは可能なのでしょうか。

どうぞよろしくお願いいたします。

マッドネスラボ

unread,
Jul 5, 2022, 3:39:00 AM7/5/22
to 宴ユーザーグループ
LangageManagerの「Language」を空欄にしておけば、プレイヤーの端末の言語を自動的に初回起動時の言語にしますので、UIを表示する必要はないかもしれません。

ドキュメントだと、LanguageとDefaultLanguageの関係がわかりづらかったかもしれませんが、次のようになります。
Language :   起動時の言語を指定する。空欄の場合は、プレイヤーの端末が使っている言語が自動的に設定される。
DefaultLanguage: プレイヤーの言語がゲーム側で用意したローカライズデータにない場合に、代わりに使う言語。
          たとえば、ゲーム側で英語と日本語だけ用意してある場合に、フランス語のプレイヤーが起動した場合に、英語で表示するのか日本語で表示するのか?という設定。

例として、
 Languageを空欄、DefaultLanguageをEnglishとしておけば、
 「初回起動時はプレイヤーの言語に合わせた言語が設定され、その言語がゲーム側で用意していない言語の場合はEnglishが表示される」ということになり、 
 日本語のプレイヤー → 日本語
 英語のプレイヤー → 英語
 フランス語のプレイヤー → 英語
 という形になります。


もちろん、明示的にUIを表示するのも親切なアプローチだと思います。
その場合の実装方法ですが、
AdvSaveManager の  isAutoSaveは、オートセーブの機能自体を有効にするかどうかの判別なので、それを使っても初回起動かは判別できません。

宴には初回起動かどうかを判別する機能が用意されているわけではないです。
やるとすれば、セーブデータを活用するしかないので、
Paramシートに初回起動フラグを追加して、それをプログラムから読み込んで利用する形になります。

サンプル:
〇 Paramシートへ初回起動フラグを追加
 「 FirstBooted」などの名前のパラメーターを追加し、Typeを「Bool」、FileTypeを「System」、Valueを「False」としてください。

〇UtageUguiBoot.cs
次のようにして追加したパラメーター(FirstBooted)を読み取って、初回起動処理を追加します。

//AdvEngineの起動待ちをする
if (isWaitBoot)
{
      while (Engine.IsWaitBootLoading) yield return null;
}

//初回起動済みフラグを読み込む
bool firstBooted = Engine.Param.GetParameterBoolean("FirstBooted");
if(!firstBooted)
{
       //初回起動済みとしてフラグを立てる
       Engine.Param.SetParameterBoolean("FirstBooted",true);
       //画面切り替え
       LanguageCheck.Open();

       //画面を遷移するならこっちの画面は閉じる。(遷移しないでこっちの画面を残すなら待機処理に書き換える)
       this.Close();
       yield break;
}


これはCoUpdateの前ではなく、CoUpdateの最中に行います。
宴の起動前に宴のパラメーターを読み込むことはできないので、Engine.IsWaitBootLoadingなどで宴の起動待ちを終わらせてからパラメーターにアクセスする形になります。



2022年7月5日火曜日 14:36:36 UTC+9 Shunpei:
Reply all
Reply to author
Forward
0 new messages