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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:18:12