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

Unity 3D中如何平滑调整向前移动飞船的Y轴位置

解决Unity飞船Y轴平滑移动问题

嘿,我明白你的问题了——直接把Y轴位置硬设成5f肯定会瞬间跳过去,完全没平滑感对吧?咱们用Unity自带的平滑插值方法就能轻松解决这个问题,给你两种常用的方案,你可以选适合自己的:

问题根源

你当前的代码是在按下上箭头时直接赋值transform.position = new Vector3(transform.position.x, 5f, transform.position.z),这会让飞船的Y轴位置瞬间跳变到目标值,自然没有过渡效果。我们需要用逐步插值的方式,让位置在多帧内慢慢接近目标值。

方案1:线性插值(Mathf.Lerp)实现匀速平滑过渡

这种方法让Y轴值匀速向目标值靠近,操作简单,适合需要匀速过渡的场景。

完整代码示例

using UnityEngine;

public class ShipMovement : MonoBehaviour
{
    // 目标Y轴位置,需要在类级别声明来持续跟踪
    private float targetY;
    // 平滑速度,数值越大过渡越快
    [SerializeField] private float smoothSpeed = 3f;

    void Start()
    {
        // 初始化目标Y为飞船当前的Y轴位置
        targetY = transform.position.y;
    }

    void Update()
    {
        // 保留你原本的向前移动逻辑
        transform.position += transform.forward * Time.deltaTime * 10f;

        // 按下上箭头时,设置目标Y为当前Y+1.5(如果还没达到这个目标的话)
        // 用GetKeyDown是按下一次触发,GetKey是按住持续触发,按需选择
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            targetY = transform.position.y + 1.5f;
        }

        // 每帧对Y轴值进行线性插值
        float smoothedY = Mathf.Lerp(transform.position.y, targetY, Time.deltaTime * smoothSpeed);
        // 更新飞船位置,保持X和Z不变
        transform.position = new Vector3(transform.position.x, smoothedY, transform.position.z);
    }
}

关键说明

  • Mathf.Lerp(a, b, t):在a和b之间按比例t插值,t的范围是0到1。乘以Time.deltaTime保证过渡速度不受帧率影响。
  • smoothSpeed:可以通过Inspector面板调整,数值越小过渡越慢,越大越快。
  • 如果你想按住上箭头时持续平滑上升,把Input.GetKeyDown改成Input.GetKey即可。

方案2:Vector3.SmoothDamp实现阻尼式平滑过渡

这种方法会自动处理加速度和减速,实现“先快后慢”的自然阻尼效果,手感更顺滑,适合追求真实移动体验的场景。

完整代码示例

using UnityEngine;

public class ShipMovement : MonoBehaviour
{
    // 目标位置,用于跟踪需要移动到的点
    private Vector3 targetPosition;
    // 平滑阻尼需要的速度变量,必须是类级别变量,因为方法会持续修改它
    private Vector3 smoothVelocity = Vector3.zero;
    // 平滑时间,单位为秒,数值越小过渡越快
    [SerializeField] private float smoothTime = 0.3f;

    void Start()
    {
        // 初始化目标位置为飞船当前位置
        targetPosition = transform.position;
    }

    void Update()
    {
        // 保留原本的向前移动逻辑
        transform.position += transform.forward * Time.deltaTime * 10f;
        // 同步目标位置的X和Z到当前飞船位置,只让Y轴有变化
        targetPosition = new Vector3(transform.position.x, targetPosition.y, transform.position.z);

        // 按下上箭头时设置目标Y轴位置
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            targetPosition.y = transform.position.y + 1.5f;
        }

        // 用SmoothDamp实现阻尼平滑移动
        transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref smoothVelocity, smoothTime);
    }
}

关键说明

  • Vector3.SmoothDamp(current, target, ref velocity, smoothTime):自动计算平滑的移动路径,smoothTime表示完成过渡所需的大致时间,smoothVelocity是方法内部使用的速度缓存变量,不需要手动修改。
  • 同样,把Input.GetKeyDown改成Input.GetKey可以实现按住持续上升的效果。

内容的提问来源于stack exchange,提问作者Faisalmirza Mirza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:02