Vector3.Lerp仅执行首次线性插值求助——飞船三点平滑移动异常
这个问题我之前也遇到过!核心原因是Vector3.Lerp本身是单次计算插值的方法,你只在按键按下的那一帧调用一次,自然只会移动一点点,不会有平滑过渡的效果。得把插值逻辑放到每一帧的循环里才行,下面给你详细的解决思路和代码示例:
解决思路
- 先在Player控制器里预设好三个固定位置点,比如左、中、右,然后维护一个
目标位置变量 - 按键输入只负责切换目标位置,而不是直接执行移动
- 在Player的
Update方法里,每一帧都调用插值方法,让飞船逐步从当前位置向目标位置平滑移动
代码实现
GameMaster脚本(输入检测部分)
保持你的输入逻辑,只需要告诉Player切换方向即可:
void Update () { if (gameIsRunning) { if (Input.GetKeyDown(KeyCode.A)) { player.MoveLeft(); } if (Input.GetKeyDown(KeyCode.D)) { player.MoveRight(); } } }
Player控制器脚本(核心移动逻辑)
这部分是实现平滑移动的关键:
using UnityEngine; public class Player : MonoBehaviour { // 在Inspector面板直接拖拽赋值三个位置点,方便调整 [SerializeField] private Vector3 leftPosition; [SerializeField] private Vector3 middlePosition; [SerializeField] private Vector3 rightPosition; // 控制移动平滑速度,数值越大移动越快 [SerializeField] private float moveSmoothSpeed = 5f; // 当前要移动到的目标位置 private Vector3 targetPosition; private void Start() { // 初始位置设为中间点 targetPosition = middlePosition; transform.position = targetPosition; } private void Update() { // 每一帧都执行插值,保证平滑移动 // 乘以Time.deltaTime让移动速度不受帧率影响 transform.position = Vector3.Lerp(transform.position, targetPosition, moveSmoothSpeed * Time.deltaTime); // 如果你想要匀速移动(没有减速效果),可以替换成下面的代码: // transform.position = Vector3.MoveTowards(transform.position, targetPosition, moveSmoothSpeed * Time.deltaTime); } public void MoveLeft() { // 按A键时,从当前位置向左切换(避免越界) if (targetPosition == rightPosition) { targetPosition = middlePosition; } else if (targetPosition == middlePosition) { targetPosition = leftPosition; } // 如果需要循环切换(左→右),可以加: // else if (targetPosition == leftPosition) targetPosition = rightPosition; } public void MoveRight() { // 按D键时,从当前位置向右切换(避免越界) if (targetPosition == leftPosition) { targetPosition = middlePosition; } else if (targetPosition == middlePosition) { targetPosition = rightPosition; } // 如果需要循环切换(右→左),可以加: // else if (targetPosition == rightPosition) targetPosition = leftPosition; } }
额外优化(可选)
如果想要更丝滑的加速度/减速度手感,可以用Vector3.SmoothDamp替代Lerp:
private Vector3 moveVelocity; // 用于存储平滑阻尼的速度值 private void Update() { // 最后一个参数是平滑时间,数值越小移动越快 transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref moveVelocity, 0.15f); }
内容的提问来源于stack exchange,提问作者Wp3Dev
相关产品推荐
相关产品推荐

