簡體   English   中英

如何在 for 循環中使用 IEnumerator?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM