为何我的游戏全向冲刺功能仅沿Y轴生效?
解决全向冲刺的移动异常问题
问题分析
你当前的代码存在两个核心问题:
- 未应用移动逻辑:仅修改
velocity但未调用move_and_slide()时,X轴移动指令未被执行,Y轴能动大概率是角色默认的重力或其他移动代码在生效。 - 瞬移感来源:直接将
velocity赋值为目标方向的最大速度,没有加速度过渡,导致角色瞬间达到冲刺速度,视觉上像瞬移。
修复方案
要实现平滑的全向冲刺,需要通过加速度过渡速度,并在物理帧中处理移动逻辑:
1. 定义冲刺相关变量
在脚本顶部添加参数,方便调试调整:
@export var dash_max_speed: float = 200.0 # 冲刺最大速度 @export var dash_acceleration: float = 1200.0 # 冲刺加速度 @export var dash_deceleration: float = 800.0 # 停止冲刺后的减速度 var is_dashing: bool = false # 标记是否处于冲刺状态
2. 改写冲刺逻辑
在_physics_process中处理输入和移动(物理相关逻辑必须放在物理帧更新里,保证稳定性):
func _physics_process(delta: float) -> void: # 处理冲刺的按下/释放事件 if Input.is_action_just_pressed("ui_accept"): is_dashing = true elif Input.is_action_released("ui_accept"): is_dashing = false if is_dashing: # 获取鼠标指向的全局方向 var target_direction = position.direction_to(get_global_mouse_position()) # 用move_toward实现平滑加速,逐步接近最大冲刺速度 velocity = velocity.move_toward(target_direction * dash_max_speed, dash_acceleration * delta) else: # 停止冲刺后平滑减速至静止 velocity = velocity.move_toward(Vector2.ZERO, dash_deceleration * delta) # 应用移动并更新速度(处理碰撞后的速度变化) velocity = move_and_slide(velocity, Vector2.UP)
关键改进点
- 用
Input.is_action_just_pressed替代is_action_pressed:避免按住按键时重复触发初始逻辑,改为标记冲刺状态,持续处理速度变化。 move_toward实现平滑过渡:让速度从当前值逐步提升到最大冲刺速度,彻底解决瞬移感。- 物理帧处理:
_physics_process会根据游戏帧率自动调整delta值,保证不同设备上的移动速度一致。
内容的提问来源于stack exchange,提问作者Lebouskie Chickpea
相关产品推荐
相关产品推荐

