gpt4 book ai didi

c# - 协程中的 Vector3.Lerp 在 Unity3D 上无法正常工作

转载 作者:行者123 更新时间:2023-12-02 16:20:35 25 4
gpt4 key购买 nike

在协同程序中使用 Vector3.Lerp 时,我遇到了一个奇怪的问题,这没有任何意义,因为我的游戏中有很多协同程序,它们都工作正常。

我想要达到的目标

我只是想通过一个名为 InVolo() 的协程和一个简单的方法将对象从起始高度移动到最终高度Vector3.Lerp 改变对象的位置。

我的代码

float elapsedTime = 0f;

while (elapsedTime < TempoSalita)
{


transform.position = Vector3.Lerp(transform.position,
new Vector3(transform.position.x, maxHight, transform.position.z), (elapsedTime / TempoSalita));


elapsedTime += Time.deltaTime;

yield return null;
}

transform.position = new Vector3(transform.position.x, maxHight, transform.position.z);
yield return null;

maxHight 只是 4f,TempoSalita 是 2f。协同程序在 OnTriggerEnter 中启动并且工作正常,对象到达 4f 的 y 并在 2 秒内退出 while。

问题

基本上,elapsedTime/TempoSalita 在 2 秒后变为 1,这是应该的,但是对象在大约 0.3 秒后到达结束位置,当 elapsed/TempoSalita 是 0.2,这对我来说毫无意义。 Vector3.Lerp 应该在 t 值从 0 到 1 的时间内从 startposendpos。但它进入了最终位置在 0.2 秒内,我不知道为什么。

我尝试了什么

我已尝试Debug.Log elapsedTime 并且它变化良好,尝试仅在 y 值之间使用 Mathf.Lerp 并且它做同样的事情。该脚本中没有其他任何东西可以影响它,协程是这样启动的:

 void OnTriggerEnter(Collider other)
{
if(other.CompareTag("Saltino"))
{
StartCoroutine(InVolo());

}
}

它只开始一次。你知道什么会导致这个奇怪的问题吗?

最佳答案

可能是您使用的条件对我来说有点可疑。

通常我会写得有点不同,比如..

var t = 0f;
var start = transform.position;
var target = new Vector3(transform.position.x, maxHight, transform.position.z);

while (t < 1)
{
t += Time.deltaTime / TempoSalita;

if (t > 1) t = 1;

transform.position = Vector3.Lerp(start, target, t);

yield return null;
}

首先,您在更改位置之前创建了起始值和目标值。 t 值将增加,直到达到(或超过)1。由于我们不希望 t 超过 1,因此我们在应用 lerp 之前进行检查。我们的 t 值是在 lerp 之外计算的,以使其清晰且易于阅读/修改。

上面的代码将运行指定的时间,并且不需要在末尾添加额外的行,因为 t 最终将恰好为 1。

关于c# - 协程中的 Vector3.Lerp 在 Unity3D 上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65598420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com