【发布时间】:2021-02-18 11:40:46
【问题描述】:
我有一个游戏对象和一个位置列表,可以。每次,我按下一个特定的按钮,它应该改变它的位置。它应该以相同的速度在当前位置和新位置之间移动,无论它们之间的距离有多长。
虽然行进速度应该每次都一样,但在开始和结束时,应该平稳地加速和减速。
这是我当前的代码:
if (Input.GetKey(KeyCode.KeypadPeriod))
{
foreach (GameObject element in wagons)
{
element.GetComponent<wagonController>().trainDestinationDisplays.GetComponent<trainDestinationDisplayController>().trainOuterDisplayDestinationChanger(trainDestination);
}
}
和:
public void trainOuterDisplayDestinationChanger(string trainDestination)
{
foreach (GameObject element in destinationDisplaysOutside)
{
Vector3 newPos = new Vector3(element.transform.localPosition.x, -85, element.transform.localPosition.z);
element.transform.localPosition = Vector3.Lerp(element.transform.localPosition, newPos, Time.deltaTime * 1);
}
}
首先,我尝试了时间轴动画,但不是很灵活(我需要为每个可能的连接制作动画,例如 Travel von A 到 B、Travel von C 到 A、Travel von B 到 A 等等关于...)。
然后,我使用 Vector3.lerp 进行了尝试,第一感觉是解决方案,但每次按下时,它只会向目标目的地迈出一小步。这是代码:
Vector3 newPos = new Vector3(transform.localPosition.x, -85, transform.localPosition.z);
transform.localPosition = Vector3.Lerp(transform.localPosition, newPos, Time.deltaTime * 1);
然后我在一篇文章中看到,lerp 不是平滑加速和减速的正确解决方案,我应该使用 SmoothDamp。在示例代码中,它看起来像这样:
public Transform target;
public float smoothTime = 0.3F;
private Vector3 velocity = Vector3.zero;
void Update()
{
Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
}
我没有让该代码工作,我也不明白 auf“速度”的用法 - 为什么速度为零?
有人可以将我推向正确的方向吗?实现目标的最佳方式是什么?我现在有点迷茫...
【问题讨论】:
-
您在更新时设置了目标位置和平滑位置。可能,这就是问题的原因。当我使用 SmoothDamp 时,我在属性中设置目标值,然后更新平滑值并以这种方式将其传递给相关函数。如果您不必在更新时获取目标位置,并且您有一个特定的航点,或者可以在更新功能之外确定,那么就这样做。只需将 targetPosition 变量移到 Update 之外并使用 SmoothDamp
-
我把它移出时总是出错。但是在切换到 Coroutine 之后,正如@derHugo 指出的那样,我不必再使用更新了 :)