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

Unity中如何使用Vector3.Lerp实现冲刺移动动画及排查代码问题

问题原因

  • 核心问题1:Input.GetKeyDown仅在按键按下的单帧触发,你写的Lerp逻辑只会执行一次,无法完成完整的位移动画
  • 核心问题2:Vector3.Lerp的第三个参数是01范围的插值进度,直接传`Time.deltaTime`(通常为0.010.02左右)单次执行只会移动总距离的1%~2%,视觉上几乎看不出位移

修正方案

需要新增状态变量记录冲刺的进度、起止位置,把冲刺的每帧更新逻辑放到输入判断外部执行,参考代码如下:
首先是类成员变量定义:

// 可在Inspector面板调整参数
public float m_DashDist = 5f; // 冲刺总距离
public float m_DashDuration = 0.2f; // 冲刺总耗时,数值越小冲刺速度越快
private bool _isDashing = false;
private Vector3 _dashStartPos;
private Vector3 _dashEndPos;
private float _dashTimeCounter;

然后是逻辑实现:

void Update()
{
    // 检测冲刺触发输入,避免重复触发
    if (Input.GetKeyDown(KeyCode.E) && !_isDashing)
    {
        _isDashing = true;
        _dashTimeCounter = 0f;
        _dashStartPos = transform.position;
        // 这里如果需要向角色面朝方向冲刺,可以替换为 _dashStartPos + transform.right * m_DashDist
        _dashEndPos = new Vector3(_dashStartPos.x + m_DashDist, _dashStartPos.y, _dashStartPos.z);
    }

    // 冲刺过程每帧更新位置
    if (_isDashing)
    {
        _dashTimeCounter += Time.deltaTime;
        // 计算0~1区间的冲刺进度
        float dashProgress = Mathf.Clamp01(_dashTimeCounter / m_DashDuration);
        // 如果需要更平滑的加减速效果,可以把dashProgress替换为Mathf.SmoothStep(0,1,dashProgress)
        transform.position = Vector3.Lerp(_dashStartPos, _dashEndPos, dashProgress);

        // 冲刺结束重置状态
        if (dashProgress >= 1f)
        {
            _isDashing = false;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:57:03