在Godot中如何实现可感知的僵尸受击透明度渐变动画?
实现Godot僵尸受击渐变动画方案
方法一:使用Tween节点(推荐)
Tween是Godot官方提供的属性插值工具,适合处理渐变动画,代码简洁且无需手动维护帧更新逻辑。
Godot 3.x 写法
func Damage_animation() -> void: # 停止正在运行的动画,避免重复调用导致效果叠加 var tween = get_node_or_null("Tween") if tween: tween.stop_all() else: tween = Tween.new() add_child(tween) # 0.2秒内渐变到受击状态(偏红半透明) tween.interpolate_property(sprite, "modulate", sprite.modulate, Color(1, 0.3, 0.3, 0.6), 0.2, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) await tween.finished # 保持受击状态1秒 await get_tree().create_timer(1) # 0.3秒内渐变恢复正常状态 tween.interpolate_property(sprite, "modulate", sprite.modulate, Color(1, 1, 1, 1), 0.3, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT) await tween.finished
Godot 4.x 写法(更简洁)
Godot 4简化了Tween的使用,直接调用create_tween()即可自动管理Tween节点生命周期:
func Damage_animation() -> void: var tween = create_tween() tween.set_parallel(false) # 按顺序执行动画步骤 # 快速渐变到受击颜色 tween.tween_property(sprite, "modulate", Color(1, 0.3, 0.3, 0.6), 0.2) # 停留1秒保持受击状态 tween.tween_interval(1) # 缓慢恢复正常外观 tween.tween_property(sprite, "modulate", Color(1, 1, 1, 1), 0.3)
方法二:手动帧插值(精细控制场景)
如果需要更灵活的动画逻辑,可以通过帧循环手动计算颜色插值:
func Damage_animation() -> void: # 渐变到受击状态 var elapsed = 0.0 var duration = 0.2 var start_color = sprite.modulate var target_color = Color(1, 0.3, 0.3, 0.6) while elapsed < duration: elapsed += delta var progress = elapsed / duration sprite.modulate = start_color.linear_interpolate(target_color, progress) await get_tree().process_frame # 保持受击状态1秒 await get_tree().create_timer(1) # 渐变恢复正常状态 elapsed = 0.0 duration = 0.3 start_color = sprite.modulate target_color = Color(1, 1, 1, 1) while elapsed < duration: elapsed += delta var progress = elapsed / duration sprite.modulate = start_color.linear_interpolate(target_color, progress) await get_tree().process_frame
效果说明
两种方法都会实现:
- 受击时快速渐变到偏红半透明状态,让玩家清晰感知击中反馈
- 保持受击状态1秒后,缓慢渐变恢复正常外观,避免视觉突兀
可根据需求调整渐变时长、颜色参数或停留时间,进一步优化视觉效果。
内容的提问来源于stack exchange,提问作者Coshgun
相关产品推荐
相关产品推荐

