シナリオシート分割と独自チャプター選択メニュー適切な実装方法について

100 views
Skip to first unread message

mini

unread,
Aug 13, 2025, 10:16:45 PMAug 13
to 宴ユーザーグループ
【宴のバージョン】Utage version 4.0.1
【UnityのバージョンとOS】Unity 6 (6000.0.40f1) , Windows 11 Home
【Unityの熟練度】約1年半の開発業務経験アリ (他、UnrealEngineやC++でのゲーム開発経験も約8年アリ)

お世話になります。miniと申します。

「設定シート&シナリオシート」のエクセルを下記の構成で分割したいと考えております。
 ・前半エクセル
  └設定シート各種
  └シナリオシート「Start」(最初に実行されるシナリオシート)
  └シナリオシート「前半チャプター分」
 ・後半エクセル
  └シナリオシート「後半チャプター分」

リファレンスを拝見する限り、この手法自体は問題無いと思いますが、
シナリオシート「Start」内で、Selectionコマンドを利用して
独自のチャプター選択メニューを実装しているため、
後半エクセルで定義されるチャプターのラベルを認識できない状態です。
 例:前半エクセル内) Selection   *後半チャプター1  ※以下省略

上記のことについて、いくつかご質問があります。
 質問1> 宴のシステム的に適切な実装方法があれば教えていただきたいです。
 質問2> 下記会話で拝見しましたが、ラベルが認識できずエラーチェックで引っかかったとしても、
    それを無視して実行すれば本件は解決(強行)できるでしょうか。
 質問3> 実は、SendMessageコマンドを利用して、
    AdvSelectionManager::AddSelection()を呼び出し、
    指定Prefabが生成されるところまではできているのですが、
    内包するButtonの入力待ちだったり、入力後のAdvUguiSelectionManager::OnTap()が実行されなかったりと、
    システムに不整合を起こしてしまいそうな印象がでてきました。
    この実装方法はあまり適切ではないでしょうか。

以上です。
ご確認ご回答のほど、よろしくお願いいたします。

マッドネスラボ

unread,
Aug 14, 2025, 4:33:31 AMAug 14
to 宴ユーザーグループ
>  質問1> 宴のシステム的に適切な実装方法があれば教えていただきたいです。

ちょっとハック的な方法ではあるのですが、
マクロのエンティティ機能を使うとエラーチェックは初期設定された値でさせるので、それを利用するという手があります。
参考:エンティティ機能 https://madnesslabo.net/utage/?page_id=2984#i-10

・Paramシートに、ジャンプ先の名前を設定するStringパラメーターを追加して
ss_1058.png

・ジャンプ先をパラメーターで変化させるマクロを作ります。Arg1にエンティティ機能で先ほど使ったパラメーターを指定します。
ss_1054.png

・マクロを使用する前に、次のようにParamコマンドでジャンプ先のシナリオラベルを設定します。
ss_1056.png

エンティティはインポート時にはParamシートの初期値でエラーチェックをするので、
Paramシートの初期値はダミーとして前半チャプターのシナリオラベルを設定してください。(サンプル画像では*Start)
また、Paramコマンドで設定した文字列が間違っていると、ランタイムでエラーになりますのでご注意ください。

>  質問2> 下記会話で拝見しましたが、ラベルが認識できずエラーチェックで引っかかったとしても、
はい。大丈夫だと思います。

>  質問3> 実は、SendMessageコマンドを利用して
選択肢機能は、内部で複数コマンドが相互作用する形になっているのでちょっと難しいかもしれません。
今回のケースでは、上記のエンティティ機能を使ってみてください。


2025年8月14日木曜日 11:16:45 UTC+9 mini:

mini

unread,
Aug 14, 2025, 11:01:01 PMAug 14
to 宴ユーザーグループ
ご回答いただきありがとうございます。

質問2、質問3については承知いたしました。
以下は質問1に関するご相談となります。

エンティティ機能を利用したマクロ化については把握できました。
ただ、試してみるとUnityEditor側のエラーチェックに引っかかるようだったので、詳細をご報告いたします。

まず、コチラのようにParam代入とマクロ呼び出しを設定しました。
Call_ScenarioSheet.jpg

これをインポートしたところ、
 |Unknown parameter ".
 |Unknown parameter Start".
というエラーログが出力されたので、下記のデバッグログを仕込みました。
Source_LogCord.jpg

これで再度インポートを実行した結果が下記のログです。
どうも、tokenの分割が想定外の形になっている気がしています。
Out_UnityEditor.jpg

もしかして、下記の該当箇所が今回の原因ではないでしょうか?
Cord_Question.jpg

ご報告は以上となります。
もし、手順や設定中に問題があればご指摘ください。
本症状について、何か原因にお心当たりがあれば教えていただきたいです。
よろしくお願いいたします。
2025年8月14日木曜日 17:33:31 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Aug 15, 2025, 5:16:37 AMAug 15
to 宴ユーザーグループ
すみません。
私のほうで不具合を再現できませんでした。原因が不明です。

スクリーンショットにある、Paramコマンドの書き方なのですが
ChapterLabelEnitity=" と、Start” が別のセルに分かれているということはあるでしょうか?
Paramコマンドでは、式はArg1に全て書くようにしてください。
(セルが分かれているならtokenの分割の部分で対象にならないはずなので、そうではないとは思うのですが、スクショではセルの枠線区切りがみえているので)

不具合を再現したいので、お手数をおかけしますが、可能であればこちらに不具合を再現可能なプロジェクトを送信していただけるでしょうか。

プロジェクト全体が難しいようであれば、リソースなどはいらないので、シナリオファイルだけでも構いません。


2025年8月15日金曜日 12:01:01 UTC+9 mini:
Message has been deleted

mini

unread,
Aug 17, 2025, 9:37:40 PMAug 17
to 宴ユーザーグループ
ご確認いただきまして、ありがとうございます。
ローカル環境が原因の可能性があること、承知しました。

Paramコマンドの書き方について、前回は紛らわしい添付画像となっており申し訳ありません。
該当セルを確認し、対象のコマンドはすべてArg1内に記入できていたので問題ございません。

ご相談いただいた再現環境の送信についてですが、
ひとまず私の方で調査し、どうしても原因が分からない場合は改めてご依頼させていただければと思います。

この調査に際し、お伺いしたいことがあります。
前回お送りしたParamコマンド (Param    ChapterLabelEntity="*Start") で ExpressionParser::SplitToken() が処理されたとき、
想定される正常な分割 (tokensの中身) はどのような形でしょうか?
 例) tokens[0] ← "
    tokens[1] ← *Start
    tokens[2] ← ”

お手数をおかけして申し訳ありません。
よろしくお願いいたします。

2025年8月15日金曜日 18:16:37 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Aug 17, 2025, 11:16:25 PMAug 17
to 宴ユーザーグループ
上記の例であれば、以下のようになるはずです。
SplitTokenの段階では、

tokens[0] ← (
tokens[1] ← ChapterLabelEntity
tokens[2] ← =
tokens[3] ← "*Start "
tokens[4] ← )
となるはずです。

参考にIDEの画面もどうぞ。

ss_1068.png


解析対象の文字列が ChapterLabelEntity="*Start" となっているかを確認してみてください。
もし、違うようであればシナリオビュワーで実行中のシナリオデータを確認してみてください。
ss_1069.png
シナリオビュワーでは、上記画像のような形で実行中のシナリオデータが確認できます。

もし、シナリオビュワー上で該当箇所のParamコマンドで実行する式の内容が誤っているようであれば、
元のシナリオファイルの記述が違うか、シナリオファイルを宴がインポートする段階でなんらかのエラーが起きている可能性が高いです。


2025年8月18日月曜日 10:37:40 UTC+9 mini:

マッドネスラボ

unread,
Aug 17, 2025, 11:32:25 PMAug 17
to 宴ユーザーグループ
上記の内容は、SplitTokenの直後の内容です。
実際にはSplitTokenのあとにさらに変換を行うので、
CalcExpメソッド内に追記されている、Debug.LogWarningの出力ではまた違う結果になると思いますのでご注意ください。




2025年8月18日月曜日 12:16:25 UTC+9 マッドネスラボ:

mini

unread,
Aug 18, 2025, 3:52:08 AMAug 18
to 宴ユーザーグループ
ありがとうございます。とても参考になりました。
まだ原因は分かっていませんが、核心には触れている気がするので経過報告をお送りします。

まず、下記のように「分割対象となるexp」と「分割中の各登録部分」にログを仕込みました。
Cord_DebugLog.jpg

その出力結果がコチラです。
教えていただいた分割想定と見比べても、やはり想定外の分割になっていますね。
Out_AddToken.jpg

冒頭で言った「核心には触れている気がする」というのは下記コードのことでして、
ラベル用の文字列として記入している「"*Start"」の部分で演算子として検知され、
演算子直前の「"」がAdd()  →  演算子として検知された「*」がAdd()  →  その後ろの「Start"」がAdd()、
という処理順になっていそうでした。
Cord_Question2.jpg
この部分だけ見ると、「ParamコマンドでのEntity代入時は*を扱えない」というのが仕様のように見受けられますが、
そういうわけではないんでしょうね……

もしかすると、この辺りに関連するcsファイルが古いゆえの挙動かとも考えたのですが、
最新のバージョン (4.2.1) の下記ファイルのどちらも差異はありませんでした。
 ・~\Utage\Scripts\GameLib\Expression\ExpressionParser.cs
 ・~\Utage\Scripts\GameLib\Expression\ExpressionToken.cs

いまは、
「文字コードやOSといったシステム的な差異によって、ダブルクォーテーションの制御に違いが発生しているのかどうか」
という調査を進めているところです。

もし、これまでの情報で想起されるものがあれば、
調査の参考になりますので何でもご連絡いただければと思います。
特に無ければ、引き続き様子見していただいて構いません。

以上です。
よろしくお願いいたします。

2025年8月18日月曜日 12:32:25 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Aug 18, 2025, 5:37:05 AMAug 18
to 宴ユーザーグループ
>「ParamコマンドでのEntity代入時は*を扱えない」
エンティティを使ったマクロ内では、Paramコマンドは使う必要はないと思いますが
仮に使っていたとしても、エンティティの処理はコマンド実行前なので、
エンティティの影響があるとしたら、SplitTokenメソッドのexp引数の時点で変わってしまっているので、
エンティティはたぶん関係ないと思います。


SplitToken内で、 文字列記号 " (ダブルクォーテーション)  で囲った文字列の扱いは、220目の部分で行っています。

case StringSeparator:
SkipGroup(StringSeparator, StringSeparator, ref strToken, exp, ref index);
isSkipped = true;
tokens.Add(ExpressionToken.CreateToken(strToken));
strToken = "";
break;
StringSeparator文字列記号 " (ダブルクォーテーション)が見つかったら、次の文字列記号までを一つのトークンとして分割してスキップします。
isSkipped がtrueになり、235行目でループがcontinueされるため、その行以下には進まず、212行目のwhileループ判定まで戻ります。
なので、266目などに文字列内の解析処理が来ている時点で何かがおかしいです。

おそらくですが、原因がわかりました。

文字列を囲む記号が間違っているのだと思います。
" (U+0022)のほうを使ってください。(C#はじめプログラムで一般的に使用されるダブルクオーテーション)

以下のものは文字列記号としては認識されないですのでご確認ください。
“ (左ダブルクオーテーションマーク, U+201C)
” (右ダブルクオーテーションマーク, U+201D)
他にも見た目が似てる記号がいくつかありますが、それも同様に文字列記号として認識されないです。
フォントによっては区別が付きづらく判別が難しいのでご注意ください。


2025年8月18日月曜日 16:52:08 UTC+9 mini:

mini

unread,
Aug 18, 2025, 10:49:59 PMAug 18
to 宴ユーザーグループ
仰る通り、ダブルクォーテーションが " (U+0022) 以外のものになっており、
これを修正したところ、エラーチェックに引っかからずに分割したラベルを記入することができました。
初歩的なところでお時間を取ってしまい、申し訳ありません。

本ミスについては落とし穴的なところがありましたので、今後のためにも記載しておきます。
私が利用していたのは「LibreOffice Calc」で、間違いなく半角英数字でダブルクォーテーションを入力していました。
しかし、「LibreOffice Calc」側には自動置換が備わっていて、それが働いた結果、今回のように全角ダブルクォーテーションが入力されていたようです。

ここまでで、シートのエラーチェックに関する相談は完了となります。
ありがとうございます。

◆◆◆

以下は、本会話の当初の目的を達成するための追加質問となります。

ご提示いただいた形 (Paramとマクロでの拡張Selection利用) でシナリオシートのエクセル分割は行えましたが、
該当ゲーム場面を実行したところ、初回のSelectionコマンドのみ認識されるような挙動となりました。

まだまだ調査不足ですが、AdvScenarioThread::CoStartPage()内に下記ログを仕込んで確認したところ、
 1. Selectionコマンドのログとして1回出力される
 2. SelectionEndコマンドのログとして出力される
 3. その後、Selectionコマンドは検知されず、ログが出力されなかった
という状態でした。
Cord_CommandLog.jpg

まずは調査の足掛かりとして、下記のことを教えていただけると助かります。
 質問1> SelectionEndコマンドが発行される条件は何でしょうか?
 質問2> 本会話でご提案いただいた方法で拡張Selectionを実現した場合、複数のSelectionを同時登録することは不可能というのが仕様だったりするでしょうか?
    (Selectionコマンド登録マクロの前に、Paramコマンドを毎回挟んでいるので、それが懸念です)
 質問3> 回答者様の方では、ご提案いただいた方法で「エクセルの分割」~「複数選択肢の生成・実行」まで動作することを確認済みでしょうか?
    (通常の環境で動作が確認できていれば、私の方で踏み込んで調査すべき線引きが明確になるので、参考としてお聞きしたいです)

毎回長々とご相談してしまい申し訳ありません。
何卒、よろしくお願いいたします。

2025年8月18日月曜日 18:37:05 UTC+9 マッドネスラボ:

マッドネスラボ

unread,
Aug 18, 2025, 11:08:22 PMAug 18
to 宴ユーザーグループ
> 質問1> SelectionEndコマンドが発行される条件は何でしょうか?
連続で設定されたSelectionコマンドの最後に自動で追加されます。
1つしかSelectionコマンドがない場合はその直後に追加されます。

>質問2> 本会話でご提案いただいた方法で拡張Selectionを実現した場合、複数のSelectionを同時登録することは不可能というのが仕様だったりするでしょうか?
>   (Selectionコマンド登録マクロの前に、Paramコマンドを毎回挟んでいるので、それが懸念です)
Selectionコマンド同士の間に別のコマンドがあり連続しなくなった場合は、それぞれにSelectionEndコマンドが追加されてしまうので、その点では不可能です。
マクロ(エンティティ含む)の内部でSelectionコマンドを使うのであれば、例にあるようにほかのコマンドを混ぜないようにしてください。


質問3> 回答者様の方では、ご提案いただいた方法で「エクセルの分割」~「複数選択肢の生成・実行」まで動作することを確認済みでしょうか?
はい。最初の回答の時点で実行確認しています。
例にあるように、Selectionコマンドを連続させる直前にParamコマンドを使うようにしてください。



2025年8月19日火曜日 11:49:59 UTC+9 mini:

mini

unread,
Aug 19, 2025, 1:07:58 AMAug 19
to 宴ユーザーグループ
頂いた回答を参考にシートの各設定を修正し、正常に分割エクセルのラベル認識・遷移実行を実現することができました。
とても助かりました。ご協力いただきましてありがとうございます。

最後に、今回のパラメータ設定例を載せて、本件の解決といたします。

Sheet_Param.jpg

Sheet_Macro.jpg

Sheet_Scenario.jpg

2025年8月19日火曜日 12:08:22 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages