unity3d - 消除 lerps 之间的延迟
问题描述
我制作了一个简单的脚本,它先到一个航点,然后再到下一个。
我的问题是,从 waypoint1 到 waypoint2 似乎有延迟,我不知道为什么:
¿ 为什么会发生这种延迟,我该如何消除它?
using UnityEngine;
using System.Collections;
public class Missile : MonoBehaviour
{
public Vector3 finalTarget;
public Transform forwardObject;
public GameObject impactAreaPrefab;
float smoothingDelay = 0.1f;
bool fired = false;
bool powerPhase = true;
Vector3 currentTarget;
private void OnEnable() {
fire(new Vector3(-25.29f, 0.5f, -10.638f));
}
void fire(Vector3 coords) {
currentTarget = forwardObject.position;
finalTarget = coords;
Instantiate(impactAreaPrefab, finalTarget, Quaternion.identity);
fired = true;
}
void Update() {
if (!fired) {
return;
}
if (powerPhase && transform.position == currentTarget) {
powerPhase = false;
currentTarget = finalTarget;
smoothingDelay = 0.05f;
}
transform.position = Vector3.Lerp(transform.position, currentTarget, Time.deltaTime / smoothingDelay);
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(Vector3.RotateTowards(transform.forward, currentTarget, 1, 0.0f)), Time.deltaTime / smoothingDelay);
}
}
解决方案
正在发生这种情况,因为您使用的 lerp 并不完全正确。如果你想获得线性运动,你应该缓存你的第一个参数(开始时的位置/旋转)并提供增加的第三个参数。发生这种延迟是因为如果您的子弹非常接近最终位置并且它仍在尝试到达那里,但是您当前的距离 |finalPos - transform.position| 是如此之小,以至于您的步骤 Time.deltaTime/smoothingDelay 几乎没有移动它。
Vector3 startPos;
Vector3 finalPos;
float currentT = 0.0f;
void Update()
{
currentT += Time.deltaTime;
transform.position = Vector3.Lerp(startPos, finalPos, currentT);
}
检查 Vector3 == Vector3 是否也不是一个好主意。使用上面的模式并检查 currentT 是否大于或等于 1。如果它是真的,那么你就在最终位置。您还可以通过划分 currentT 来控制运动持续时间。
推荐阅读
- python - 即使检测到 GPU,Pytorch 也没有使用 GPU
- php - 添加出现在 Woocommerce 中选定变体上的额外文本
- postgresql - 如何将 docker 容器连接到远程 postgresql
- protractor - 出现 Toastr 通知时应触发事件
- ios - Firebase 5.0.0+ 和 iOS 7.0
- python - Python - 平均网格角的颜色图?
- python - Pyplot 上的多个 x 标签
- javascript - 在 Google 数据工作室社区连接器中建模嵌套数据
- javascript - HTML 输入上的 addEventListener 在 Android WebView 中不起作用
- ajax - 为什么在Larvel中使用ajax从数据库中检索数据时,网页的整个正文而不是数据加载到表中