Unity VR开发:如何实现for循环等待用户输入的交互控制逻辑
问题解决方案
核心问题原因
你当前代码的逻辑缺陷在于:yield return new WaitForSeconds(duration + 5)是固定时长等待,等待结束后只会检测当前一帧的按键输入,只要用户没有刚好在这一帧按下对应按键,就会直接跳过输入判断进入下一轮循环,完全没达到等待用户输入完成的效果。
另外注意你代码中错误判定用的按键是f,但需求里说明错误按w键,需要先统一按键规则。
修正后的代码
// 提前定义全局的分数变量,你原有代码应该已经声明该变量 public int score = 1; // 初始数字长度默认从1开始,可根据需求调整 IEnumerator playDSBtask() { bool secondWrong = false; fillList(); for (int i = 0; i < 10; i++) { List<AudioSource> x = chooseList(score); AudioSource myAudio = x[0]; float duration = myAudio.clip.length; myAudio.Play(); // 第一步:等待音频完整播放完成 yield return new WaitForSeconds(duration); // 第二步:阻塞等待用户按下有效按键,未检测到有效输入则一直等待 bool inputReceived = false; while (!inputReceived) { // 检测正确按键r if (Input.GetKeyDown(KeyCode.R)) { score++; secondWrong = false; inputReceived = true; } // 检测错误按键w,与需求规则对齐 else if (Input.GetKeyDown(KeyCode.W)) { if (!secondWrong) { secondWrong = true; } else { score = Mathf.Max(1, score - 1); // 防护逻辑:避免数字长度减到0以下 secondWrong = false; } inputReceived = true; } // 未检测到有效输入则等待一帧后再次检测 yield return null; } x.Remove(myAudio); } // 可在此处添加10轮任务完成后的收尾逻辑,比如显示结果、跳转界面等 Debug.Log("10轮任务已完成"); }
逻辑说明
- 用
while循环在协程内做输入阻塞,只有用户按下r或者w有效按键后,才会退出循环进入下一轮for循环,完全符合等待用户输入完成再继续的需求,不需要替换for循环结构 - 新增了分数下限防护逻辑,避免连续错误导致数字长度变为负数
- 删除了原代码中无意义的
myAudio.GetComponent<AudioSource>();语句,myAudio本身已经是AudioSource类型不需要重复获取 - 如果需要限制用户最长作答时间,可以在输入等待的
while循环内增加计时逻辑,超过指定时间直接判定为作答错误即可
内容的提问来源于stack exchange,提问作者sarahrht
相关产品推荐
相关产品推荐

