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