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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:27