Unity多音频按用户输入条件顺序播放的实现咨询
Unity 多音频按输入顺序播放实现方案
原有代码问题梳理
- 直接使用
Invoke在音频播放结束后立即执行校验逻辑,没有等待用户输入的状态拦截,会导致未输入时自动重复触发逻辑 - 校验逻辑存在错误:遍历预期回复列表时,只要任意一个选项不匹配就会触发重播,哪怕用户输入了正确内容也可能被错误判定
- 没有定义当前流程阶段的状态变量,无法适配多段音频不同的校验规则,也没法复用逻辑
核心实现思路
新增两个状态变量控制流程:
currentAudioIndex:标记当前正在播放/校验的音频对应数组下标isWaitingForInput:标记当前是否处于等待用户输入的状态,避免播放过程中用户输入误触发校验,也避免音频重复播放
音频播放结束后才进入等待输入状态,仅在用户主动提交输入时才执行校验逻辑,不做自动轮询校验。
完整实现代码
using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.SceneManagement; public class AudioFlowControl : MonoBehaviour { public AudioSource Voice; public AudioClip[] allSpeech; public InputField userInput; // 建议用InputField组件替代Text,适配输入提交事件 private List<List<string>> allExpectedResponses = new List<List<string>>(); private int currentAudioIndex = 0; private bool isWaitingForInput = false; void Start() { // 按顺序配置每段音频对应的预期回复,下标对应音频数组下标 allExpectedResponses.Add(new List<string> { "male", "female" }); // 第1段音频的预期回复 allExpectedResponses.Add(new List<string> { "Yes", "No" }); // 第2段 allExpectedResponses.Add(new List<string> { "Yes", "No" }); // 第3段 allExpectedResponses.Add(new List<string> { "Yes", "No" }); // 第4段 allExpectedResponses.Add(new List<string> { "Yes" }); // 第5段,只有Yes符合要求 Voice = GetComponent<AudioSource>(); // 绑定输入提交事件,用户输入完成后触发校验 userInput.onEndEdit.AddListener(OnUserSubmitInput); PlayCurrentAudio(); } // 播放当前索引对应的音频 void PlayCurrentAudio() { isWaitingForInput = false; userInput.text = string.Empty; // 清空上一次输入内容 Voice.clip = allSpeech[currentAudioIndex]; Voice.Play(); // 音频播放结束后进入等待输入状态 Invoke(nameof(StartWaitForInput), Voice.clip.length); } // 进入等待输入状态 void StartWaitForInput() { isWaitingForInput = true; } // 用户提交输入时触发的校验逻辑 void OnUserSubmitInput(string inputContent) { // 未到等待输入状态时,不响应输入 if (!isWaitingForInput) return; bool inputValid = false; // 校验输入是否符合当前阶段的预期 foreach (string expected in allExpectedResponses[currentAudioIndex]) { if (inputContent.Trim() == expected) { inputValid = true; break; } } if (inputValid) { // 输入符合要求 if (currentAudioIndex == allSpeech.Length - 1) { // 是最后一段音频,校验通过跳转场景,替换成你的场景名 SceneManager.LoadScene("TargetScene"); } else { // 跳到下一段音频 currentAudioIndex++; PlayCurrentAudio(); } } else { // 输入不符合要求,重新播放当前音频 PlayCurrentAudio(); } } }
使用注意事项
- 需要把场景中的输入框组件替换为
InputField(UGUI)或者对应输入组件,绑定对应的提交事件即可 - 音频数组
allSpeech按顺序填充audio1到audio5即可,无需调整其他配置 - 如果需要触发校验的逻辑是用户点击按钮而不是输入结束,只需要把按钮的
OnClick事件绑定到OnUserSubmitInput方法,参数传userInput.text即可
内容的提问来源于stack exchange,提问作者jugnu
相关产品推荐
相关产品推荐

