Godot 3.5 でシンプルなメッセージウインドウ
画面下部にあるメッセージウインドウの実装
Controlノードの MarginContainer や Panel などを組み合わせてメッセージウインドウのレイアウトを作成する

gdextends MarginContainer
const CHAR_READ_RATE = 0.005
onready var label = $MarginContainer/Label
enum State {
READY,
READING,
FINISHED
}
var current_state = State.READY
var text_queue = []
func _ready():
hide_textbox()
queue_text("Let's stop the slots to move on to the adventure.Press the Space key or the ten key.")
Global.connect("add_text", self, "queue_text")
Global.connect("go_next_floor", self, "reset_queue")
func _process(delta):
match current_state:
State.READY:
if !text_queue.empty():
display_text()
State.READING:
pass
# label.percent_visible = 1.0
# $Tween.remove_all()
# change_state(State.FINISHED)
State.FINISHED:
change_state(State.READY)
func queue_text(next_text):
text_queue.push_back(next_text)
func reset_queue():
text_queue.clear()
func hide_textbox():
label.text = ""
hide()
func show_textbox():
show()
func display_text():
var next_text = text_queue.pop_front()
label.text = next_text
label.percent_visible = 0.0
change_state(State.READING)
show_textbox()
$Tween.interpolate_property(label, "percent_visible", 0.0, 1.0, len(next_text) * CHAR_READ_RATE, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
$Tween.start()
func change_state(next_state):
current_state = next_state
func _on_Tween_tween_all_completed() -> void:
yield(get_tree().create_timer(0.2), "timeout")
change_state(State.FINISHED)
次々とメッセージ表示要求が出ても大丈夫なように、signal を受信したら text_queue
にどんどん溜め込んでいき、queueにメッセージがあるならば表示している。
メッセージが頭から順番に表示される仕組みは Godot の Labelノードにある percent_visible
設定を変動させるだけで実現できる。
Tweenでこの percent_visible
値を 0 -> 1に変化させるだけでそれっぽいメッセージ表示ができる。
参考動画