簡體   English   中英

停止所有代碼執行直到滿足條件(Unity C#)

[英]Stopping all code execution until condition is met (Unity C#)

我發現了很多關於試圖解決這個問題的協程的信息(waitUntil()、while 循環、不同的產量變化等),但我對它們的問題是代碼的 rest 在它仍然被執行之后還是協程中的代碼尚未完成,或者它無限循環並凍結 Unity 編輯器。 例如,即使沒有按下任何按鈕,以下代碼也會打印調試消息(協程仍在等待按下按鈕以完成其代碼塊本身)。

ChoiceButtons.enableButtons();
StartCoroutine(WaitUntilButtonPress());
UnityEngine.Debug.Log("It skipped it.");
ChoiceButtons.setButtonPressed(false);
ChoiceButtons.disableButtons();

我需要能夠停止所有進一步的代碼執行,直到特定的 function 返回 true。 是否有一個特定的 function 我剛剛錯過了完成這個或我必須設置循環的特定方式(可能使用一些奇怪的東西,比如像 SpinWait.SpinUntil() 這樣的線程函數?)。 老實說,我完全不知所措,因為它似乎肯定會在協程中擁有自己的 function 但我找不到任何東西

Coroutine不會延遲通過StartCoroutine本身調用它的方法; 否則你的主線程會凍結,從而消除協程的全部目的;)

您絕對不想做的是因為您將它“停止所有代碼執行”,因為..這也會凍結您的主線程->您將無法按下任何按鈕;)


如果您想等待例程完成,您有兩個主要選擇:

要么使整個調用方法成為例程

public void YourOriginalMethod()
{
    StartCoroutine (YourMethodRoutine());
}

private IEnumerator YourMethodRoutine ()
{
    ChoiceButtons.enableButtons();
    // This executed the wait routine and wait for it to finish
    yield return WaitUntilButtonPress();

    ChoiceButtons.setButtonPressed(false);
    ChoiceButtons.disableButtons();
}

或者您可以使用回調模式並在等待完成后執行回調。 因為我不知道你的WaitForButtonPress這里是虛擬代碼

public void YourOriginalMethod()
{
    ChoiceButtons.enableButtons();

    // Start the routine and pass a callback what to do when done
    // here e.g. as lambda expression
    StartCoroutine (WaitUntilButtonPress(() =>
    {
        ChoiceButtons.setButtonPressed(false);
        ChoiceButtons.disableButtons();
    }));
}

private IEnumerator WaitUntilButtonPress (Action whenDone)
{
    // Whatever your routine is waiting for
    yield return new WaitUntil(()=>buttonPressed);

    whenDone?.Invoke();
}

或相同但沒有 lambda 而是一種方法

public void YourOriginalMethod()
{
    ChoiceButtons.enableButtons();

    // Start the routine and pass a callback what to do when done
    StartCoroutine (WaitUntilButtonPress(AfterButtonWasPressed));
}

private void AfterButtonWasPressed()
{
    ChoiceButtons.setButtonPressed(false);
    ChoiceButtons.disableButtons();
}

private IEnumerator WaitUntilButtonPress (Action whenDone)
{
    // Whatever your routine is waiting for
    yield return new WaitUntil(()=>buttonPressed);

    whenDone?.Invoke();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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