Godot 4中相机缩放函数触发后瞬间结束,无法完成平滑过渡
Godot 4相机平滑缩放失效问题解决
问题根源
- 仅在按键触发时调用一次缩放函数,导致缩放逻辑只执行一帧,无法持续完成过渡效果。
- 缩放函数内的
zooming变量未结合帧更新函数(如_process)循环执行缩放逻辑,状态标记未起到持续驱动作用。
解决方案1:基于帧更新的Lerp实现
修改相机节点代码,将缩放逻辑移至_process中持续执行,按键仅触发缩放状态:
var zooming: bool = false var target_zoom: float = 1.0 var zoom_speed: float = 2.0 # 调整此值控制过渡速度,值越大过渡越快 @onready var player = $"../player" func _process(delta: float) -> void: position = player.position # 持续处理缩放过渡 if 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.x = target_zoom zoom.y = target_zoom zooming = false # 启动放大(目标缩放值3) func zoomi(): target_zoom = 3.0 zooming = true # 启动缩小(目标缩放值1,可根据需求调整) func unzoomi(): target_zoom = 1.0 zooming = true
修改玩家节点代码,按键时仅触发相机缩放状态,无需传递delta:
var speed = 75 var dir: Vector2 = Vector2.ZERO var enter: bool = false @onready var camera = $"../camera" func _ready(): randomize() _choose_random_direction() func _physics_process(delta: float) -> void: velocity = dir * speed if Input.is_action_just_pressed("accept"): camera.unzoomi() move_and_slide() func _choose_random_direction(): var directions = [ Vector2(-1, 0), Vector2(1, 0), # Left, Right Vector2(0, -1), Vector2(0, 1), # Up, Down Vector2(-1, -1), Vector2(1, -1), # Top-left, Top-right Vector2(-1, 1), Vector2(1, 1), # Bottom-left, Bottom-right Vector2(0, 0) ] dir = directions[randi() % directions.size()] await get_tree().create_timer(randf_range(1, 3)).timeout _choose_random_direction()
解决方案2:使用Tween实现精确2秒过渡(推荐)
Tween是Godot内置动画工具,可精准控制过渡时长,避免帧率波动影响效果:
@onready var player = $"../player" @onready var tween = create_tween() func _process(delta: float) -> void: position = player.position # 放大:2秒内从当前缩放过渡到3 func zoomi(): tween.stop() # 停止之前的动画,避免冲突 tween.tween_property(self, "zoom", Vector2(3, 3), 2.0) # 可选:添加缓动效果,让过渡更自然 tween.set_ease(Tween.EASE_IN_OUT) tween.set_trans(Tween.TRANS_QUAD) # 缩小:2秒内从当前缩放过渡到1 func unzoomi(): tween.stop() tween.tween_property(self, "zoom", Vector2(1, 1), 2.0) tween.set_ease(Tween.EASE_IN_OUT) tween.set_trans(Tween.TRANS_QUAD)
玩家节点代码同解决方案1,仅需调用camera.unzoomi()即可。
内容的提问来源于stack exchange,提问作者fabricio408 morales
相关产品推荐
相关产品推荐

