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
相关产品推荐
相关产品推荐

