首页 > 解决方案 > 消除 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);
 }
 }

标签: unity3dlerp

解决方案


正在发生这种情况,因为您使用的 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 来控制运动持续时间。


推荐阅读