在当前协程中启动一个新的协程是否安全?
Is it safe to start a new coroutine inside a current coroutine?
我有一个基于网格的游戏,我在其中编写了我的移动脚本来逐个单元地移动我的游戏对象。为了实现我想要的逐个单元移动,我不得不使用协程。
这是我的代码的伪代码片段:
private Coroutine currentCoroutine;
public void Move(Vector3 velocity)
{
currentCoroutine = StartCoroutine(MoveCoroutine(velocity));
}
private IEnumerator MoveCoroutine(Vector3 velocity)
{
Vector3 endPoint;
Vector3 nextVelocity;
if(velocity == Vector3.Right)
{
endPoint = rightEndPoint;
// object should move left in the next coroutine
nextVelocity = Vector3.Left;
}
else
{
endPoint = leftEndPoint;
// object should move right in the next coroutine
nextVelocity = Vector3.Right;
}
while(currentPos != endPoint)
{
currentPos += velocity
yield return new WaitForSeconds(movementDelay);
}
currentCoroutine = StartCoroutine(MoveCoroutine(nextVelocity));
}
基本上这就是左右移动我的对象。如果它已经到达左边缘,我让它向右移动,反之亦然。我从另一个脚本调用 Move()
。
这段代码对我来说工作正常。但是,我不确定在协程中启动一个新的协程是否安全,就像我在这里所做的那样。这样写协程会有什么后果吗?我还在习惯协程的概念。
谢谢
在协程结束时启动一个新的协程是安全的。顺便说一句,我注意到您的 yield 语句仅在 while 循环内调用。如果 while 循环有可能不会 运行 至少一次,你就会出错;所有协程都必须执行 yield 语句。
我有一个基于网格的游戏,我在其中编写了我的移动脚本来逐个单元地移动我的游戏对象。为了实现我想要的逐个单元移动,我不得不使用协程。
这是我的代码的伪代码片段:
private Coroutine currentCoroutine;
public void Move(Vector3 velocity)
{
currentCoroutine = StartCoroutine(MoveCoroutine(velocity));
}
private IEnumerator MoveCoroutine(Vector3 velocity)
{
Vector3 endPoint;
Vector3 nextVelocity;
if(velocity == Vector3.Right)
{
endPoint = rightEndPoint;
// object should move left in the next coroutine
nextVelocity = Vector3.Left;
}
else
{
endPoint = leftEndPoint;
// object should move right in the next coroutine
nextVelocity = Vector3.Right;
}
while(currentPos != endPoint)
{
currentPos += velocity
yield return new WaitForSeconds(movementDelay);
}
currentCoroutine = StartCoroutine(MoveCoroutine(nextVelocity));
}
基本上这就是左右移动我的对象。如果它已经到达左边缘,我让它向右移动,反之亦然。我从另一个脚本调用 Move()
。
这段代码对我来说工作正常。但是,我不确定在协程中启动一个新的协程是否安全,就像我在这里所做的那样。这样写协程会有什么后果吗?我还在习惯协程的概念。
谢谢
在协程结束时启动一个新的协程是安全的。顺便说一句,我注意到您的 yield 语句仅在 while 循环内调用。如果 while 循环有可能不会 运行 至少一次,你就会出错;所有协程都必须执行 yield 语句。