Godot 2D Camera2D使用lerp实现平滑缩放失效问题求助
问题分析与修复
为什么直接跳变?
你代码里的Input.is_action_just_pressed("accept")只在按键按下的第一帧返回true,所以lerp插值代码只会执行一次,根本没法实现持续的平滑过渡。另外你用0.4 * get_process_delta_time()作为插值系数,这个值极小(60帧下约0.0067),单次执行几乎看不到变化,但如果你的初始缩放值和3.0差距很小,就会看起来像是直接跳变了。
修复代码
要实现按一次键就平滑过渡到目标缩放值,需要加个状态变量标记是否要进行缩放,然后在_process里持续执行插值直到完成:
extends Camera2D @onready var timer = $Timer var is_zooming: bool = false var target_zoom: float = 3.0 # 调整这个值控制过渡快慢,越大越快 var zoom_speed: float = 2.0 func _process(delta: float) -> void: # 按下按键时开启缩放状态 if Input.is_action_just_pressed("accept"): is_zooming = true # 持续插值直到完成 if is_zooming: zoom.x = lerp(zoom.x, target_zoom, zoom_speed * delta) zoom.y = lerp(zoom.y, target_zoom, zoom_speed * delta) # 当缩放值足够接近目标时,直接设为目标值并停止过渡 if abs(zoom.x - target_zoom) < 0.01: zoom = Vector2(target_zoom, target_zoom) is_zooming = false
额外说明
- 用
is_zooming状态变量来控制是否持续执行插值,避免只触发一次的问题。 - 用
zoom_speed * delta作为插值系数,保证不同帧率下过渡速度一致。 - 最后加的阈值判断是为了避免浮点数精度问题,防止程序一直卡在无限接近目标值的状态。
内容的提问来源于stack exchange,提问作者fabricio408 morales
相关产品推荐
相关产品推荐

