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

