KRXCUBJK

Dialogue Manager 3メモ

2025-05-06

godotの会話ダイアログアドオン「Dialogue Manager 3」についてのメモ。

テキスト

メッセージ

通常

名前: こんにちは。

一行がメッセージひとつとして扱われる。
複数行をひとつのメッセージとして表示する場合は、インデントを付ける。

名前:の記載で、発言者の名前枠が出る。

ランダム表示

名前: こんにちは。[[私|僕|俺]]です。

[[A|B]]のように区切ると、うち一つをランダムで表示する。

ランダムなテキスト:
% 内容1
% 内容2
% 内容3

行をランダムで表示するのはこれ。
下三つのうちどれか一つを表示する。ブロックメッセージも可。

%3 名前: This line has a 60% chance of being picked
%2 名前: This line has a 40% chance of being picked

%の前の数字で重みづけ。

選択肢

名前: ご用件をお話しください。
- こんにちは
名前: こんにちは~。
- 何でもないです
- さようなら => END

-で選択肢をつなぐ。
選択肢内への入れ子も可能。その場合はインデントを揃えること。
どこかにジャンプさせてもよい。

- 条件付き選択肢 [if Global.property]

[]付きで、選択肢表示のフラグを設定する。

場面切り分け・シーン変遷

タイトル

~ start

~タイトルで、タイトル名を設定。これがジャンプ先になる。

ジャンプ

=> start

特定のタイトルへジャンプ。

=> ENDでフローを終了。
=> END!でフローを強制終了する。

=>< タイトル

タイトル呼び出し後、ENDなどのタイミングでジャンプ元に戻る。
通常の呼び出しだと戻ってこない。コンテントみたいな感じ。

シグナル

GDScriptと同様に発信できる。

ダイアログ内からSomeGlobalにあるsome_signalという名前のシグナルに一つの引数を渡す場合:

do SomeGlobal.some_signal.emit("引数")

他ダイアログをインポートしてジャンプ

別のファイルからダイアログを読み込む:

  1. import "res://snippets.dialogue" as snippets
    ダイアログ上で別ファイルを読み込み
  2. =>< snippets/banter
    1のタイトルへジャンプする

シーンへの追加

スクリプトからダイアログを呼び出すには以下のようにする:

DialogueManager.show_dialogue_balloon(resource, title)

引数内に呼び出しダイアログとタイトルをやる。

@onready var d = preload("res://dialogue.dialogue")

func _ready():
DialogueManager.show_dialogue_balloon(d, "start")

記法

match

matchを使用可能。
冗長なif文を省略するときなどに。

match SomeGlobal.some_property
when 1
ひとつめ
when > 5
1以外、かつ5以下
else
その他

while

while。説明不要。

while SomeGlobal.some_property < 10
{{SomeGlobal.some_property}}が10以下の場合、ここの内容をくり返し
do SomeGlobal.some_property += 1
くり返しが終了

変数

表示

{{}}の中身はそのまま表示。キャラクター名部分にも同様に指定できる。

名前: 変数の内容は{{SomeGlobal.some_property}}です。

変数の書き換え

変数の書き換えにはset、関数の呼び出しにはdoを使用する。

以下はSomeGlobalという名前のグローバル上のfunc animate(string, string) -> voidメソッドを呼び出す:

if SomeGlobal.has_met_npc == false
do SomeGlobal.animate("npc", "Wave") # 関数の呼び出し
名前: こんにちは
set SomeGlobal.has_met_npc = true # 変数の変更

ダイアログの一文をリクエストする際に、extra_game_states パラメーターとしてノードやオブジェクトの配列を渡すことができ、これらも変化(ミューテーション)メソッドがあるかチェックされます。

変化は、ダイアログの中に直接書き込むこともできます。インラインで指定された変化は、テキストとしてダイアログが表示されていく中で、その位置に到達したときに実行されます。

null結合

定義済みかどうか分からないプロパティを参照する場合、プロパティ前にを付ける。

if some_reference?.name == "SomeNode"
名前: あおあおあ~

some_referenceがnullの場合、左辺全体がnullとなるためfalseとなる。
通常通りのif文だとフリーズする。