Unity中移动SmoothDamp和Lerp简易用法

SmoothDamp平滑缓冲移动,多用于摄像机移动

transform.position = Vector3.SmoothDamp(transform.position, endPos, ref velocity, Time.deltaTime);

Lerp,每次移动为到目标点的剩余距离的n%

transform.position = Vector3.Lerp(transform.position, endPos, t);

其中t为剩余距离百分比,Lerp可以实现匀速到目标点移动,t的计算方式如下

var t = 1 / ((transform.position - endPos).magnitude);

 

Unity的`Vector3.Lerp`方法用于在两个向量之间进行线性插值,它接受三个参数:起始向量、结束向量和一个介于0到1之间的插值因子。当`Vector3.Lerp`用于动画或平滑移动物体时,如果将其放在`Update`方法并以固定频率更新插值因子,可能会遇到抖动问题。 抖动问题通常发生在游戏的帧率不稳定时。由于每一帧更新的时间间隔不一致,插值因子的增加也会出现不均匀,导致物体移动出现不平滑的现象,这在视觉上表现为抖动。 为了减少或避免这种抖动,可以采取以下措施: 1. 使用`Time.deltaTime`或`Time.unscaledDeltaTime`来控制插值因子的增加。这样可以使物体的移动速度与帧率无关,从而确保无论帧率如何变化,物体的移动都是一致的。 ```csharp void Update() { // 使用Time.deltaTime来平滑移动 transform.position = Vector3.Lerp(startPosition, endPosition, Time.deltaTime * speed); } ``` 2. 预先计算插值因子。在`Update`方法之外计算出一个固定的插值步长,然后在每次`Update`调用时应用这个步长。 ```csharp float lerpFactor = 0.01f; // 预先设置一个小的插值步长 void Update() { lerpFactor += Time.deltaTime * speed; // 根据帧率调整插值因子 transform.position = Vector3.Lerp(startPosition, endPosition, lerpFactor); } ``` 3. 使用协程(Coroutine)来控制插值过程。通过协程可以控制插值的开始和结束,以及插值速率,从而使得物体的移动更加平滑。 ```csharp IEnumerator LerpPosition() { float startTime = Time.time; while (Time.time < startTime + duration) { float lerpProgress = (Time.time - startTime) / duration; transform.position = Vector3.Lerp(startPosition, endPosition, lerpProgress); yield return null; } transform.position = endPosition; } void Update() { StartCoroutine(LerpPosition()); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值