これを作ります。

前提アドオン

なお、立ち絵を作るだけならDialogicはなくても良いです。

立ち絵を作る

練習用立ち絵素材
Download

まばたきと口パクをつくる

尻尾のアニメーションを作る

実際にDialogicで動かせるようにする

Dialogicのノードをきれいな名前で追加する

Dialogicを公式の方法でそのまま使うと

リモートがこんな汚いことになります。かなしいね。
このままだと相対パスでも絶対パスでも使いにくいので、きれいな名前で再生できるようにします。

この改造方法はDialogic1.4.1の派生Dialogic ruby textが前提です

func _ready():
var new_dialog = Dialogic.start("hoge") # タイムライン「hoge」を再生
new_dialog.name = "Dialog" # DialogicのノードがDialogicで追加されるようになる
add_child(new_dialog)

きれいになりました。
ただ、まだ立ち絵が雑な名前です。このままだと後々のスクリプトが書けなくなります。なので、res://addons/dialogic/Nodes/DialogNode.gdで「ADD IT TO THE SCENE」を検索し、出てきたスクリプトの下に追記します。

# ADD IT TO THE SCENE
$Portraits.add_child(p)
#追記 
p.name = character_data["name"]
#追記終わり

これできれいなツリーになります。

表情差分を切り替えるスクリプトを書く

次に表情差分を切り替えるスクリプトを書いていきます。
今回の場合AnimationTreeのTransitionの値をいじることで切り替えるようにします。
前提として、これはDialogicのCall Nodeから呼び出す仕組みになってます。

func face_set(charactername,eyebrow,eye,mouth):
var character_node_path = "../Scene/Dialog/DialogNode/Portraits/" + charactername + "/DialogicCustomPortraitScene/" # 立ち絵一覧の場所定義
var eyebrow_node = get_node(character_node_path + "EyeBrow") # 眉毛ノード取得
var eye_node = get_node(character_node_path + "Eye_Tree") # 目ノード取得
var mouth_node = get_node(character_node_path + "Mouth_Tree") # 口ノード取得
eyebrow_node.frame = int(eyebrow) # 眉毛はAnimatedSpriteなのでフレーム変えるだけでOK
eye_node["parameters/Transition/current"] = int(eye) # Transitionの値を変える
mouth_node["parameters/Transition/current"] = int(mouth) # Transitionの値を変える

実際に呼び出すときはこんな感じです

Dialogicで呼び出すこと前提になっていますが、パスを変えれば他のアドオンや自作でも行けると思います。

フォーカスされたら口パクするようにする

口パク……させたいですよね。
これはDialogicのノードをちょっといじるだけで大丈夫です。res://addons/dialogic/Nodes/Portrait.gdでfocus()を検索、出てきた場所に追記します。

func focus():
if not fading_out:
tween_modulate(modulate, Color(1,1,1, 1))
# 追記
$"./DialogicCustomPortraitScene/Mouth_Tree".active = true

これだけでフォーカスされたときに口パクするようになります。
表情差分の種類と再生を別々にすることで表情差分に対応できるようにしました。
また、Blendで3秒後に口パクが止まるアニメーションを挟んでいるため、自動で口パクが止まります。やったね。

完成

とりあえずこれで実際に動かせるようにはなったと思います。
こうした方が良いという改善の提案、不明点ありましたらお気軽にコメントください。
立ち絵を作る部分のテキスト化が必要でしたらそれもコメントください。気が向いたらテキスト化します。

それでは、また……