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

Vector3.Lerp仅执行首次线性插值求助——飞船三点平滑移动异常

这个问题我之前也遇到过!核心原因是Vector3.Lerp本身是单次计算插值的方法,你只在按键按下的那一帧调用一次,自然只会移动一点点,不会有平滑过渡的效果。得把插值逻辑放到每一帧的循环里才行,下面给你详细的解决思路和代码示例:

解决思路
  1. 先在Player控制器里预设好三个固定位置点,比如左、中、右,然后维护一个目标位置变量
  2. 按键输入只负责切换目标位置,而不是直接执行移动
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:53:08