使用 Threading.Sleep(1000);在 C# 统一中

Using of Threading.Sleep(1000); in C# unity

我正在统一做一个小测验。我希望在单击正确答案时播放音频。虽然播放音频的行代码在thread.Sleep()之前,但在播放问答时,它在打开音频之前就休眠了!! 我将不胜感激任何帮助。提前致谢。

public void OnMouseDown()
    {
        checkAnswer();
    }
    public void checkAnswer()
    {
        if (Correct == true)
        {
            audioo = this.gameObject.GetComponent<AudioSource>();
            audioo.enabled = true;
            Thread.Sleep(5000); 
            NextQuiz.SetActive(true);
            CurrentQuiz.SetActive(false);
        }
        else
        {

        }
    }

音频播放发生在主线程上(Unity 主要是 single-threaded)并且您的代码使当前(当前的主)线程进入睡眠状态,因此在线程从睡眠中醒来之前不会播放音频。

要解决此问题,您可能需要考虑使用 Unity coroutines。启动 yield return new WaitForSeconds(5); 的协程,然后开始下一个测验。

我假设 unity 在停止休眠后正在播放音频?在这种情况下,为什么不简单地使用协程呢?类似于:

public void OnMouseDown(){
     {
           CheckAnswer();
     }
     public void CheckAnswer();
     {
        if (Correct == true)
        {
            audioo = this.gameObject.GetComponent<AudioSource>();
            StartCoroutine(PlaySound(audioo));
        }
        else
        {

        }
    }

IEnumerator PlaySound(AudioSource sound)
{
    //Play the sound here, then load up the next question.
    audioo.enabled = true;
    yield return new WaitForSeconds(5f);
    NextQuiz.SetActive(true);
    CurrentQuiz.SetActive(false);
}

此外,您还可以通过简单地创建 2 个 AudioClip 变量并为其中一个分配正确的声音,为另一个分配不正确的声音,然后使用 audioo.Play(clipName) 以便播放合适的片段,像这样:

public AudioClip correctSound;
public AudioClip incorrectSound;

public void OnMouseDown(){
     {
           CheckAnswer();
     }
     public void CheckAnswer();
     {
        if (Correct == true)
        {
            audioo = this.gameObject.GetComponent<AudioSource>();
            StartCoroutine(PlaySound(audioo, correctSound));
        }
        else
        {

        }
    }

IEnumerator PlaySound(AudioSource audioSource, AudioClip audioClip)
{
    //Play the sound here, then load up the next question.
    audioSource.Play(audioClip);
    yield return new WaitForSeconds(5f);
    NextQuiz.SetActive(true);
    CurrentQuiz.SetActive(false);
}

尝试类似的东西