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

如何解决Godot中CharacterBody2D的velocity报错与平滑移动问题

问题分析与解决代码

首先明确你原代码的核心问题:

  1. 直接将方向向量赋值给velocity,未结合MAX_SPEED控制移动速度
  2. move_and_slide的参数错误,该方法内部会自动处理帧率无关的delta,不需要手动乘delta
  3. 缺少加速度常量定义,导致建议的move_toward方法无法使用

下面是修正后的完整代码,以及关键修改说明:

extends CharacterBody2D
const MAX_SPEED = 400
const ACCELERATION = 1200  # 可根据手感调整,数值越大加速越快

var velocity = Vector2.ZERO

func _physics_process(delta):
    # 获取输入方向
    var direction = Vector2.ZERO
    direction.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
    direction.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
    
    # 归一化方向,避免斜向移动时速度超过MAX_SPEED
    if direction.length() > 0:
        direction = direction.normalized()
    
    # 用move_toward实现平滑加速/减速逻辑
    if direction != Vector2.ZERO:
        # 朝着目标速度(方向*最大速度)逐步加速
        velocity = velocity.move_toward(direction * MAX_SPEED, ACCELERATION * delta)
    else:
        # 无输入时逐步减速到静止
        velocity = velocity.move_toward(Vector2.ZERO, ACCELERATION * delta)
    
    # 执行移动,move_and_slide无需手动乘delta
    move_and_slide(velocity)

关键修改说明

  • 新增ACCELERATION常量:控制角色加速/减速的快慢,可根据游戏手感调整数值
  • 方向归一化:斜向同时输入上下左右时,原始方向向量长度会大于1,归一化后保证任何方向移动速度都不超过MAX_SPEED
  • 替换velocity赋值逻辑:用move_toward替代直接赋值,实现平滑的加速和减速效果,避免瞬间启停的生硬感
  • 修正move_and_slide参数:传入原始velocity即可,方法内部会自动结合帧率计算移动距离

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:18