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

为何我的游戏全向冲刺功能仅沿Y轴生效?

解决全向冲刺的移动异常问题

问题分析

你当前的代码存在两个核心问题:

  1. 未应用移动逻辑:仅修改velocity但未调用move_and_slide()时,X轴移动指令未被执行,Y轴能动大概率是角色默认的重力或其他移动代码在生效。
  2. 瞬移感来源:直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:42:38