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("引数")
他ダイアログをインポートしてジャンプ
別のファイルからダイアログを読み込む:
import "res://snippets.dialogue" as snippets
ダイアログ上で別ファイルを読み込み=>< 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文だとフリーズする。