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

Godot使用Tween延迟实现黑白淡入效果失效问题求助

问题根因
  • 核心问题是_process每帧都会执行补间插入逻辑,重复插入的补间会覆盖/打断未完成的任务,导致带延迟的补间永远无法正常执行完毕:
    1. 玩家静止时,每帧都会往TweenNode插入带2秒延迟的变黑补间,相当于延迟被不断重置,始终无法进入实际的过渡阶段;即使静置满2秒后补间开始执行,下一秒的_process还是会插入新的补间,打断正在进行的过渡
    2. 一旦玩家移动,马上会插入0.1秒变透明的补间,直接把刚启动的变黑补间覆盖,就会出现你看到的「闪一下就变回透明」的现象
  • 额外优化点:onready var velocity没必要声明为onready,这个变量是每帧赋值的,初始化无实际意义。
修复方案

你需要新增状态变量记录当前的玩家移动状态,只有当状态发生切换的时候,才调用补间逻辑,避免每帧重复插入:

extends Sprite
onready var TweenNode = get_node("../Tween")
var velocity
# 新增状态标记,记录上一帧的移动状态
var last_is_moving = false

func _ready():
    modulate.a = 0

func _process(delta):
    velocity = get_node("../../").velocity
    var current_is_moving = velocity != Vector2.ZERO
    # 只有状态切换的时候才触发补间
    if current_is_moving != last_is_moving:
        # 先清空之前未完成的补间,避免冲突
        TweenNode.remove_all()
        if not current_is_moving:
            # 静止:延迟2秒后用5秒过渡到不透明黑
            TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 1), 5, Tween.TRANS_EXPO, Tween.EASE_OUT_IN, 2)
        else:
            # 移动:立刻用0.1秒过渡到透明
            TweenNode.interpolate_property(self, "modulate", modulate, Color(0, 0, 0, 0), .1, Tween.TRANS_EXPO, Tween.EASE_OUT_IN)
        TweenNode.start()
        # 更新状态标记
        last_is_moving = current_is_moving
修复说明
  • 新增last_is_moving变量记录上一帧的移动状态,只有状态切换的时候才执行补间逻辑,不会每帧重复插入
  • 插入新补间前调用remove_all()清空TweenNode中未完成的旧任务,避免新旧补间冲突
  • 如果在静止2秒的等待阶段玩家又开始移动,会立刻清空等待中的补间,执行变透明的逻辑,符合交互预期

内容的提问来源于stack exchange,提问作者briyoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:27:02