本日は DialogueSystem の勉強枠です。
DialogueSystem のダイアログエディタの使い方を確認しながら記事にします。
前回記事
以下の前回記事の続きです。
bluebirdofoz.hatenablog.com
Conditions(条件)
[...]ドロップダウンメニューまたは手動入力を使用して Lua 式を[Conditions]フィールドに追加すると、Lua 式が true の場合にのみ会話でそのエントリを使用できるようにすることができます。
プレイヤーがパリを訪れた場合にのみNPCにセリフを言わせたいときは初期値が false の変数 "VisitedParis" を定義します。
プレイヤーがパリを訪れたら変数を true に設定し、NPCのダイアログエントリに以下の条件を追加します。
・Dialogue Text:"あなたはパリについてどう思いましたか?"
・Condition:Variable["VisitedParis"] == true
会話は1つ先の Conditions を評価します
Dialogue System は会話の1つ前のレベルにリンクを評価します。
1つのノード(ノードAなど)で値を設定した場合、Dialogue System はノードAを実行する前にノードBの状態をすでにチェックしているため、次のノード(ノードB)で値をチェックすることはできません。
条件の評価を遅らせたい場合、空のスペーサーノードでそれらを分離する必要があります。これを実証するために、コインを投げる会話の例を使用します。
https://www.pixelcrushers.com/dialogue_system/manual2x/html/dialogue_editor.html#dialogueEditorNodeKeyboardShortcutsより引用
上記の例では、[Flipping coin]ノードは変数 x をランダムに 1 か 2 に設定します。
Dialogue System は1つ先のレベルを評価するため、1つ先の条件付きノード([ヘッド]と[テール])でこれをすぐに判定することはできません。
[Flipping coin]ノードが実行される前に[ヘッド]と[テール]の条件をすでにテストしています。
この問題を回避するには、会話に中間ノードを追加します。
ダイアログテキストを空白のままですが、タイトルに[delay evaluation]を使用して、それが何のためにあるのかを分かりやすくしています。
Sequence を None() に設定して、会話の次のステップにすぐに進むようにします。
コンティニューボタンを使用している場合、[Sequence]フィールドで[+]ボタンから[Continue -> Simulate continue button click]を選択します。
Conditions を操作するときは Dialogue System Controller コンポーネントの[Debug Level]を一時的に[Info]に設定すると役立つ場合があります。
これにより、[Console]ウィンドウに多くの情報が表示されるようになります。
例えば、以下に示すようなログが表示されます。
Dialogue System: Lua(x = math.random(2)) Dialogue System: Referee says 'Flipping coin...' Dialogue System: Block on False Link (Referee): ID=5:3 'Heads!' Condition='x == 1' Dialogue System: Add Link (Referee): ID=5:4 'Tails!' (True) Dialogue System: Referee says 'Tails!'
3行目は、'x == 1'がfalseであるため[Heads]へのリンクがブロックされていることを示しています。
その後4行目で[Tails]へのリンクを追加しています('x == 2'がtrueであるため)。
Sim Status
どのダイアログエントリが使用されたかを追跡する場合、それらのダイアログエントリが使用されるのを条件付きでブロックする場合は Sim Status を使用します。
Dialogue System Controller コンポーネントで[Include SimStatus]にチェックマークを付けます。これにより、ランタイム文字列値 Dialog[#] が追加されます。(#はダイアログエントリのID番号)
ID 番号は、ダイアログエントリを調べることで確認できます。また内部 Lua 変数 "thisID" も設定され、そこから選択できます。[...]ドロップダウンメニューを使用して現在のノードを参照します。
Sim Status はダイアログエントリノードごとに約20バイトを使用します。
数万行のダイアログがある場合は本当に必要でない限り、これにチェックマークを付けるべきではありません。
代わりに、条件が必要な特定の領域で変数を使用してください。
Sim Status に指定できる値は次のとおりです。
・"Untouched":プレイヤーの応答メニューにエントリが話されたり表示されたりしたことはありません。
・"WasOffered":プレイヤーの応答メニューに表示されましたが、プレイヤーによって選択されていません。
・"WasDisplayed":(プレイヤーまたは NPC によって) 話されました。
以下のように使用できます。
[1] Dancer: "What can I do for ya, detective?" [2] Player: "Where were you on Saturday night?" Conditions: Dialog[3].SimStatus == "Untouched" [3] Dancer: "Right here on this stage until dawn." [END] [4] Player: "You said you were here until dawn. Then who made a call from your place at 9PM?" Conditions: Dialog[3].SimStatus == "WasDisplayed" [5] Dancer: "My cousin's staying with me for the week. What's it to ya?" [END]
"thisID"のような特殊変数値を使用して、現在のノードの ID を参照することもできます。
Dialog[thisID].SimStatus ~= "WasDisplayed"
別の会話の Sim Status にアクセスするには以下のように参照します。
Conversation[#].Dialog[#].SimStatus == "WasDisplayed"
最初(Conversation)の # は会話IDで、2番目(Dialog)の # は対話ノードIDです
Sim Status はグループチェックボックスがチェックされているダイアログエントリに対しては常に"Untouched"です。
応答メニューで選択済みの応答を異なる見た目で表示する
Sim Status を使用する場合、ダイアログマネージャーの入力設定の[em# Tag For Old Responses]が利用できます。
これを[None]から変更すると、プレーヤーが既に選択した応答エントリに強調タグを適用できます。
一部のゲームではこれを使用してプレイヤーに、すでに選択した応答の選択肢を思い出させることができます。
長くなったので記事を分けます。
次は Conversations カテゴリの続きです。
bluebirdofoz.hatenablog.com