我正在 VR 中撰寫一個任務,用戶會聽到一個帶有一定數量數字的音頻檔案,然后需要按下一個鍵。如果他做對了,那么他應該按“r”,然后將播放一個多出一個數字的音頻檔案。如果他做錯了,他應該按“w”,如果這是他在正確答案之后的第一個錯誤答案,則會播放一個音頻檔案,該檔案的數字數量與以前相同。如果他做錯了,而且之前已經做錯了,那數字就減一。
總共會有 10 個音頻檔案,這就是我決定使用 for 回圈的原因。
但是現在我不知道如何讓 for 回圈等待用戶輸入。我還讀到,當您必須等待用戶輸入時,使用 for 回圈通常不是上帝,但我不知道我還能做什么。
到目前為止,這是我的代碼:
IEnumerator playDSBtask()
{
bool secondWrong = false;
fillList();
for (int i = 0; i < 10; i = i 1)
{
List<AudioSource> x = chooseList(score);
AudioSource myAudio = x[0];
float duration = myAudio.clip.length;
myAudio.GetComponent<AudioSource>();
myAudio.Play();
yield return new WaitForSeconds(duration 5);
if (Input.GetKeyDown("r"))
{
score ;
secondWrong = false;
}
else if (Input.GetKeyDown("f") && secondWrong == false)
{
secondWrong = true;
}
else if (Input.GetKeyDown("f") && secondWrong == true)
{
score--;
}
x.Remove(myAudio);
}
}
但這行不通,因為如果 if 或 else if 陳述句都不為真,則 for 回圈將繼續執行并因此執行。
uj5u.com熱心網友回復:
在您的情況下使用 for 回圈完全沒問題,因為它在協程中,您在其中屈服,因此不會有無限回圈,因此不會凍結主執行緒。
你可能會使用WaitUntil類似的東西
...
yield return new WaitForSeconds(duration 5);
// Wait until any o the expected inputs is pressed
yield return WaitUntil(() => Input.GetKeyDown("r") || Input.GetKeyDown("f"));
// then check which one exactly
if (Input.GetKeyDown("r"))
{
...
或者,這也可以以更通用的方式完成,但也更容易出錯
...
yield return new WaitForSeconds(duration 5);
// wait until something breaks out of the loop
while(true)
{
// check if any key was pressed
if(Input.anyKeyDown)
{
// handle r key
if (Input.GetKeyDown("r"))
{
score ;
secondWrong = false;
// important!
break;
}
else if (Input.GetKeyDown("f"))
{
if(!secondWrong)
{
secondWrong = true;
}
else
{
score--;
}
// Important!
break;
}
}
// if nothing called break wait a frame and check again
yield return null;
}
x.Remove(myAudio);
...
通常,您可能希望使用KeyCode.FandKeyCode.R代替字串。
從 UX 的角度來看,盡管您希望減少 5 秒的等待時間或/并在處理/等待用戶輸入時顯示某種 UI 反饋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332869.html
上一篇:有沒有辦法讓UnityTextMeshPro下拉選項的字體與串列中的其他選項不同?
下一篇:UnityPlayer通過物件
