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

