[英]How do I use an IEnumerator in a for loop?
我正在嘗試制作一個蛇游戲,我希望用戶以固定的速度一次移動 1 個方格。 我想計算屏幕邊緣的距離,然后將我的 IEnumerator 循環多次到達那里。 我的方形角色的第一個動作按預期工作,但隨后它只是捕捉到它要去的屏幕一側。 我該如何防止這種情況?
bool firstgo = true;
void Start()
{
transform.position = new Vector3(0, 0, 0);
}
void Update()
{
CalculateMovement();
}
private IEnumerator Delay(int x,int y,int z)
{
if (firstgo == true)
{
transform.position += new Vector3(x, y, z);
firstgo = false;
}
else
{
yield return new WaitForSeconds(0.5f);
transform.position += new Vector3(x, y, z);
}
}
void CalculateMovement()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
if (transform.position.y != 4)
{
float updistance = 4f - transform.position.y;
for (int i = 0; i < updistance; i++)
{
StartCoroutine(Delay(0, 1, 0));
}
}
}
if (Input.GetKeyDown(KeyCode.DownArrow))
{
if (transform.position.y != -4)
{
float downdistance = 4f + transform.position.y;
for (int i = 0; i < downdistance; i++)
{
StartCoroutine(Delay(0, -1, 0));
}
}
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
if (transform.position.x != 4)
{
float rightdistance = 4f - transform.position.x;
for (int i = 0; i < rightdistance; i++)
{
StartCoroutine(Delay(1, 0, 0));
}
}
}
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
if (transform.position.x != -4)
{
float leftdistance = 4f + transform.position.x;
for (int i = 0; i < leftdistance; i++)
{
StartCoroutine(Delay(-1, 0, 0));
}
}
}
}
問題是,在你的 for 循環中發生的所有事情都發生在單幀中,你最終會同時啟動多個協同程序。 因此,如果您在 y=0 並向上移動,您將啟動四個協程。 首先將立即執行其代碼,其他三個將在半秒后同時觸發他們的代碼,因此您可以快速執行邊緣行為。
為了防止這種情況,您必須將循環放在協同例程主體中,並在循環中使用 yield。 也許你應該在你的協程中添加一個參數來參數化它的步數。
那應該回答你的問題,但坦率地說,使用協同程序來解決這個問題似乎不合適:當用戶改變方向時,你需要阻止它們,而且這種情況可能經常發生。 開始協同程序執行單個動作然后殺死它似乎是一種矯枉過正。 只需在更新中使用計時器,根據最后輸入的方向將玩家移動一個空間並檢查他是否已經在邊緣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.