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

GDScript Camera2D缩放问题求助(新手开发者)

解决Godot Camera2D移动时缩放、静止恢复的问题

原代码问题梳理

  1. 输入判断错误:重复检测move_left,漏掉了move_right,导致无法响应向右移动的缩放触发
  2. 缩放逻辑颠倒:Godot的Camera2D.zoom属性中,值大于1是向外缩放(缩小画面),小于1是放大画面。原代码往0.1调整是放大,和你要的“向外缩放”需求相反
  3. Delta参数误用:target_zoom * delta会把目标缩放值按帧时间缩小,完全不符合预期;lerp的插值系数必须乘以delta才能保证帧率无关的平滑效果
  4. 目标缩放初始化错误:初始设为Vector2(0,0)会导致相机一开始缩放异常,应该默认设为正常缩放Vector2(1,1)
  5. 相机跟随坐标逻辑错误:直接混用全局坐标和局部坐标计算目标位置,应该将玩家的全局坐标转换到相机父节点的局部空间,保证坐标空间一致

修正后的代码

extends Camera2D

@onready var player = $"../player"
@onready var target_zoom: Vector2 = Vector2(1.0, 1.0)  # 初始化为正常缩放

const X_LERP_SPEED: float = 5.0  # 提高速度让跟随更灵敏
const Y_LERP_SPEED: float = 5.0
const ZOOM_LERP_SPEED: float = 2.0

const MOVE_ZOOM: Vector2 = Vector2(1.2, 1.2)  # 移动时的向外缩放值
const IDLE_ZOOM: Vector2 = Vector2(1.0, 1.0)  # 静止时的正常缩放值


func _process(delta):
    # 判断玩家是否处于移动/跳跃状态
    var is_moving = Input.is_action_pressed("move_left") || Input.is_action_pressed("move_right") || Input.is_action_pressed("jump")
    
    # 设置目标缩放值
    if is_moving:
        target_zoom = lerp(target_zoom, MOVE_ZOOM, ZOOM_LERP_SPEED * delta)
    else:
        target_zoom = lerp(target_zoom, IDLE_ZOOM, ZOOM_LERP_SPEED * delta)
    
    # 平滑应用缩放
    zoom = lerp(zoom, target_zoom, ZOOM_LERP_SPEED * delta)

    # 平滑跟随玩家:将玩家全局坐标转换到相机父节点的局部空间
    var target_position = get_parent().to_local(player.global_position)
    position.x = lerp(position.x, target_position.x, X_LERP_SPEED * delta)
    position.y = lerp(position.y, target_position.y, Y_LERP_SPEED * delta)

关键修正说明

  • 缩放逻辑调整:定义MOVE_ZOOM为1.2(向外缩小画面),IDLE_ZOOM为1.0,通过lerp让目标缩放平滑过渡,避免直接硬改数值
  • Delta正确使用:所有lerp的插值系数都乘以delta,保证不管帧率高低,平滑速度一致
  • 坐标空间修正:用get_parent().to_local(player.global_position)将玩家的全局坐标转换为相机父节点的局部坐标,确保跟随位置正确
  • 输入判断修复:补上move_right的检测,确保所有移动/跳跃动作都能触发缩放

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 04:52:47