あなた:
GDScript2で、ダメージテキストを作りたい。下記の仕様を満たすための実装は?
- 2Dの横スクロールアクションを作っている
- ダメージ発生までのロジックは別で実装しているためここでは考慮しなくてよい
- ダメージ量を数値で表示し一定時間で消えること
- 赤い文字で表示すること
- ダメージ発生地点から右上に飛び跳ね、重力に従って落ちる動作をする
- 時間経過によってだんだん透過して消える
了解です。以下に、「初期値を pending_amount
として渡し、_ready()
内で設定する」方式で DamageText.gd
をまとめ直しました。
DamageText.gd
(初期値渡し&_ready内で設定)gdscriptextends Node2D @export var lifetime := 1.0 # 生存時間(秒) @export var gravity := 400.0 # 重力加速度 @export var initial_velocity := Vector2(50, -200) # 初期速度(右上に飛ぶ) @export var fade_duration := 0.5 # フェードアウト時間 var velocity := Vector2.ZERO var elapsed := 0.0 var pending_amount: int = 0 # 表示するダメージ値 @onready var label: Label = $Label func _ready(): velocity = initial_velocity # ラベルにダメージ値を設定(赤く表示) label.text = str(pending_amount) label.modulate = Color(1, 0, 0, 1) func _process(delta: float) -> void: elapsed += delta # 重力運動 velocity.y += gravity * delta position += velocity * delta # フェードアウト処理 if elapsed >= lifetime - fade_duration: var alpha = 1.0 - (elapsed - (lifetime - fade_duration)) / fade_duration label.modulate.a = clamp(alpha, 0.0, 1.0) # 寿命を過ぎたら削除 if elapsed >= lifetime: queue_free()
gdscriptfunc _on_hit(global_hit_position: Vector2, damage: int): var damage_text = preload("res://DamageText.tscn").instantiate() damage_text.position = to_local(global_hit_position) damage_text.pending_amount = damage add_child(damage_text)
この方式はシンプルかつ安全で、_ready()
のタイミングに処理を合わせることで不具合が出にくくなります。
このあと「色分け」「クリティカル表現」「フォント切り替え」なども同様に pending_
変数で渡して _ready()
で反映できます。
他にカスタマイズしたい演出ありますか?