在继续使用函数 C# Unity 之前等待协程完成
Wait for a coroutine to finish before moving on with the function C# Unity
我正在努力让一个单位在 Unity2d 中通过网格移动。我让运动毫无问题地工作。
我希望函数 MovePlayer 等到协程完成后再继续,所以程序会等到玩家完成移动后再发出更多命令。
这是我的代码:
public class 玩家:MonoBehaviour {
public Vector3 position;
private Vector3 targetPosition;
private float speed;
void Awake ()
{
speed = 2.0f;
position = gameObject.transform.position;
targetPosition = position;
GameManager.instance.AddPlayerToList(this); //Register this player with our instance of GameManager by adding it to a list of Player objects.
}
//Function that moves the player, takes a list of nodes as path
public void MovePlayer(List<Node> path)
{
StartCoroutine(SmoothMovement(path));
//Next step should wait until SmoothMovement is finished
}
private IEnumerator SmoothMovement(List<Node> path)
{
float step = speed * Time.deltaTime;
for (int i = 0; i < path.Count; i++)
{
targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);
float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
yield return null;
}
position = transform.position;
}
}
您不能在主线程中等待函数中的协程,否则您的游戏将冻结,直到您的函数结束。
为什么不在协程结束时调用下一步?
private IEnumerator SmoothMovement(List<Node> path)
{
float step = speed * Time.deltaTime;
for (int i = 0; i < path.Count; i++)
{
targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);
float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
yield return null;
}
position = transform.position;
}
//Next Step
}
此外,如果回答了这个问题,有些人无法使用 itectori 的解决方案,所以这是我的解决方案:
你可以
yield return StartCoroutine(yourCoroutine);
但是在这种情况下你的函数不能return无效。
我正在努力让一个单位在 Unity2d 中通过网格移动。我让运动毫无问题地工作。 我希望函数 MovePlayer 等到协程完成后再继续,所以程序会等到玩家完成移动后再发出更多命令。
这是我的代码: public class 玩家:MonoBehaviour {
public Vector3 position;
private Vector3 targetPosition;
private float speed;
void Awake ()
{
speed = 2.0f;
position = gameObject.transform.position;
targetPosition = position;
GameManager.instance.AddPlayerToList(this); //Register this player with our instance of GameManager by adding it to a list of Player objects.
}
//Function that moves the player, takes a list of nodes as path
public void MovePlayer(List<Node> path)
{
StartCoroutine(SmoothMovement(path));
//Next step should wait until SmoothMovement is finished
}
private IEnumerator SmoothMovement(List<Node> path)
{
float step = speed * Time.deltaTime;
for (int i = 0; i < path.Count; i++)
{
targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);
float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
yield return null;
}
position = transform.position;
}
}
您不能在主线程中等待函数中的协程,否则您的游戏将冻结,直到您的函数结束。
为什么不在协程结束时调用下一步?
private IEnumerator SmoothMovement(List<Node> path)
{
float step = speed * Time.deltaTime;
for (int i = 0; i < path.Count; i++)
{
targetPosition = new Vector3(path[i].coordinatesX, path[i].coordinatesY, 0f);
float sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon)
{
transform.position = Vector3.MoveTowards(transform.position, targetPosition, step);
sqrRemainingDistance = (transform.position - targetPosition).sqrMagnitude;
yield return null;
}
position = transform.position;
}
//Next Step
}
此外,如果回答了这个问题,有些人无法使用 itectori 的解决方案,所以这是我的解决方案:
你可以
yield return StartCoroutine(yourCoroutine);
但是在这种情况下你的函数不能return无效。