Dialogic2には組み込みのスタイルがいくつか用意されていて、バブルスタイル(つまり吹き出し)がある。
これは2Dか3Dのノードに、Dialogicのキャラクターを設定しておくことによって、そのノードから吹き出しが出る仕組みっぽい。
ただ、微妙に使いづらい。
キャラクターリソース(dchファイル)を、Playerに設定することはできた。これはまぁ普通にロードして設定しておくだけなので。
で、現在のレイアウトを読み込もうとするとNullが返ってくる。
これはまぁ、Dialogicの仕組み上、毎回会話を表示するレイヤーのノードを消すため、会話が始まらない限りレイアウトは存在しないってのが正しい。
なので、Dialogicの設定としてLayout Node behaviourの中にOn Timeline Endって項目のがあるので、これをHide Layout Nodeに変更。
これによって一度レイアウトが作られたら以降は表示・非表示を切り替えるだけになるはず。
で、コードとして‥‥‥
GDScriptfunc _setup_dialogic_character() -> void:
if dialogic_character_resource_path == "":
return
var character_resource: Resource = load(dialogic_character_resource_path)
if character_resource and character_resource is DialogicCharacter:
var dialogic_character: DialogicCharacter = character_resource as DialogicCharacter
var layout := Dialogic.Styles.get_layout_node()
if layout == null:
layout = Dialogic.Styles.load_style("default_layout") # バブルスタイル
if layout and layout.has_method("register_character"):
layout.register_character(dialogic_character, self)
ログでわかる通り、まずCurrent LayoutはNullが返る。先ほどと同じだが、1度でもセリフを表示しないと(つまりタイムラインが実行されないと)レイアウトが生成されない。
なので、強制的にdefault_layoutをロード‥‥‥あ。
俺が作ったスタイルの名前は「default_style」なのに、ロードしようとしてるのは「default_layout」になってしまってる。
なるほど、フォールバックして別のスタイルが作られる理由がわかった。
記事を書いてよかった。
だが、新たな問題が‥‥‥
どうやら、Dialogicの組み込みのBubbleのパーツ(吹き出し自体)の位置情報を計算するロジックが結構限定的っぽい。
実際のコードを抜き出してみる。
GDScriptfunc get_speaker_canvas_position() -> Vector2:
if is_instance_valid(node_to_point_at):
if node_to_point_at is Node3D:
base_position = get_viewport().get_camera_3d().unproject_position(
(node_to_point_at as Node3D).global_position)
if node_to_point_at is CanvasItem:
base_position = (node_to_point_at as CanvasItem).get_global_transform_with_canvas().origin
return base_position
base_positionが読みに行ってるのはget_vieport()になってる。
つまり、現在この吹き出しが存在するViewportの中の3Dカメラを見に行ってる。
逆に言うと、専用で別のViewport内で動かしてるカメラの取得に失敗する。
これは改善の余地ありですな。
おそらくカスタムスタイルでレイアウトを作成し、このパーツをインスタンス化している根っこのtext_bubble_layerを継承してパーツも継承したものを一部改変・オーバーライドして使う感じになりそうですな。
いやいや、Saitos氏、なかなかやりますな。
方針が決まっただけだいぶ前進でござるよ。Aheadでござるよ。
さ、深夜のテンションになってきたんで、明日やります。
キャラクターを指定しない状態であれば、座標を見に行かないでフォールバックしてダミーシーンが表示されるので、ポジションさえ指定できるようにオーバーライドすればいけるだろう。
そしたらまた明日。しーゆー。