协程中的Vector3.Lerp在Unity3D上无法正常工作
c#
在使用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 中启动并且工作正常,对象到达 y 4f 并在 2 秒内退出 while。
问题
基本上,应该在 2 秒后elapsedTime / TempoSalita
变为1,但是对象在 0.3 秒后到达结束位置,当elapsed/TempoSalita
是 0.2 时,这对我来说毫无意义。Vector3.Lerp 应该在t值从 0 到 1的时间内从startpos转到endpos。但是它在 0.2 秒内到达最终位置,我不知道为什么。
我的尝试
我尝试Debug.Log
过 elapsedTime 并且它正在改变,尝试仅Mathf.Lerp
在 y 值之间使用并且它做同样的事情。该脚本中没有任何其他内容可以影响它,这就是协程的启动方式:
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。