Godot使用Tween延迟实现黑白淡入效果失效问题求助
问题根因
- 核心问题是
_process每帧都会执行补间插入逻辑,重复插入的补间会覆盖/打断未完成的任务,导致带延迟的补间永远无法正常执行完毕:- 玩家静止时,每帧都会往TweenNode插入带2秒延迟的变黑补间,相当于延迟被不断重置,始终无法进入实际的过渡阶段;即使静置满2秒后补间开始执行,下一秒的
_process还是会插入新的补间,打断正在进行的过渡 - 一旦玩家移动,马上会插入0.1秒变透明的补间,直接把刚启动的变黑补间覆盖,就会出现你看到的「闪一下就变回透明」的现象
- 玩家静止时,每帧都会往TweenNode插入带2秒延迟的变黑补间,相当于延迟被不断重置,始终无法进入实际的过渡阶段;即使静置满2秒后补间开始执行,下一秒的
- 额外优化点:
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
相关产品推荐
相关产品推荐

