You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 10:46:14