在循环中一步步启动协程
Start Coroutine step-after-step in loop
我有一个包含游戏对象的列表(称为路径)。当前游戏对象(附有脚本)应该从路径中游戏对象的一个位置逐步移动到下一个位置。我当前的代码使它立即移动到路径的最后一个位置。我已经在 Coroutine 的末尾尝试了 WaitForSeconds
但是因为它们都是同时启动的,所以它没有效果。
怎样做才能得到步进效果?
这里是我的代码:
public List<GameObject> path;
private Vector3 start;
private Vector3 target;
private float lungeSpeed = .8f;
private float lungeDistance = 5;
private IEnumerator coroutine;
public void StartPath() {
foreach (GameObject field in path) {
start = transform.position;
target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
coroutine = MoveObject(start, target, lungeSpeed);
StartCoroutine(coroutine);
}
}
IEnumerator MoveObject(Vector3 start, Vector3 target, float speed)
{
float t = 0.0f;
float rate = 1.0f / speed;
while (t < 1.0)
{
t += Time.deltaTime * rate;
transform.position = Vector3.Lerp(start, target, t);
yield return null;
}
yield return new WaitForSeconds(1);
}
现在您在 StartPath
中的代码没有等待 MoveObject
完成。您可以通过 运行ning StartPath
在协程中解决这个问题并使用 yield return MoveObject(start, target, lungespeed)
。
仍然会在 startPath
中停止执行 foreach 循环,直到 MoveObject
完成 yield return new WaitForSeconds
public IEnumerator StartPath() {
foreach (GameObject field in path) {
start = transform.position;
target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
coroutine = MoveObject(start, target, lungeSpeed);
yield return StartCoroutine(coroutine);//this will keep the foreach loop from iterating untill the coroutine has finished
}
}
还有一点旁注:
(because the coroutine is executed in a new parallel thread)
不正确。协同程序在单独的线程上执行 not 运行。主线程上的协程 运行s 与所有其他代码一样,它只是做了一个小技巧,它根据你的 yield 语句暂停和恢复执行,但仍在主线程上。
如果您想 运行 在单独的线程上执行某些操作,您需要调用 new Thread()
。然而,这是一个完全不同的小菜一碟,因为线程不能继承自 Monobehaviour
我有一个包含游戏对象的列表(称为路径)。当前游戏对象(附有脚本)应该从路径中游戏对象的一个位置逐步移动到下一个位置。我当前的代码使它立即移动到路径的最后一个位置。我已经在 Coroutine 的末尾尝试了 WaitForSeconds
但是因为它们都是同时启动的,所以它没有效果。
怎样做才能得到步进效果?
这里是我的代码:
public List<GameObject> path;
private Vector3 start;
private Vector3 target;
private float lungeSpeed = .8f;
private float lungeDistance = 5;
private IEnumerator coroutine;
public void StartPath() {
foreach (GameObject field in path) {
start = transform.position;
target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
coroutine = MoveObject(start, target, lungeSpeed);
StartCoroutine(coroutine);
}
}
IEnumerator MoveObject(Vector3 start, Vector3 target, float speed)
{
float t = 0.0f;
float rate = 1.0f / speed;
while (t < 1.0)
{
t += Time.deltaTime * rate;
transform.position = Vector3.Lerp(start, target, t);
yield return null;
}
yield return new WaitForSeconds(1);
}
现在您在 StartPath
中的代码没有等待 MoveObject
完成。您可以通过 运行ning StartPath
在协程中解决这个问题并使用 yield return MoveObject(start, target, lungespeed)
。
仍然会在 startPath
中停止执行 foreach 循环,直到 MoveObject
完成 yield return new WaitForSeconds
public IEnumerator StartPath() {
foreach (GameObject field in path) {
start = transform.position;
target = new Vector3(field.transform.position.x + lungeDistance, field.transform.position.y, field.transform.position.z);
coroutine = MoveObject(start, target, lungeSpeed);
yield return StartCoroutine(coroutine);//this will keep the foreach loop from iterating untill the coroutine has finished
}
}
还有一点旁注:
(because the coroutine is executed in a new parallel thread)
不正确。协同程序在单独的线程上执行 not 运行。主线程上的协程 运行s 与所有其他代码一样,它只是做了一个小技巧,它根据你的 yield 语句暂停和恢复执行,但仍在主线程上。
如果您想 运行 在单独的线程上执行某些操作,您需要调用 new Thread()
。然而,这是一个完全不同的小菜一碟,因为线程不能继承自 Monobehaviour