You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:48:02