Vector3.Lerp 在 Unity3D 上协程内部无法正常工作
Vector3.Lerp inside a Coroutine is not working as it should on Unity3D
我在协同程序中使用 Vector3.Lerp
时遇到一个奇怪的问题,这没有任何意义,因为我的游戏中有很多协同程序,它们都工作正常。
我正在努力实现什么
我只是想通过一个名为 InVolo()
的协程将对象从 starting 高度移动到 final 高度和一个简单的 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 值的时间内从 startpos 到 endpos从 0 到 1。但它在 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 之外计算的,以使其清晰易懂 read/modify.
以上将 运行 指定的时间,并且不需要在末尾添加额外的行,因为 t 最终将恰好为 1。
我在协同程序中使用 Vector3.Lerp
时遇到一个奇怪的问题,这没有任何意义,因为我的游戏中有很多协同程序,它们都工作正常。
我正在努力实现什么
我只是想通过一个名为 InVolo()
的协程将对象从 starting 高度移动到 final 高度和一个简单的 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 值的时间内从 startpos 到 endpos从 0 到 1。但它在 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 之外计算的,以使其清晰易懂 read/modify.
以上将 运行 指定的时间,并且不需要在末尾添加额外的行,因为 t 最终将恰好为 1。