C# 统一中随机间隔上的随机音频

C# 统一中随机间隔上的随机音频,c#,android,audio,unity3d,C#,Android,Audio,Unity3d,基本上,我在做一个团结的游戏。我需要一些音频剪辑以随机间隔随机循环并播放。至于现在,我已经写了一个脚本,应该这样做,但我有问题。以下是脚本: using UnityEngine; using System.Collections; public class AudioController : MonoBehaviour { [SerializeField] private AudioClip[] clips; private int clipIndex; private AudioSourc

基本上,我在做一个团结的游戏。我需要一些音频剪辑以随机间隔随机循环并播放。至于现在,我已经写了一个脚本,应该这样做,但我有问题。以下是脚本:

using UnityEngine;
using System.Collections;

public class AudioController : MonoBehaviour
{

[SerializeField] private AudioClip[] clips;
private int clipIndex;
private AudioSource audio;
private bool audioPlaying = false;

void Start()
{
    audio = gameObject.GetComponent<AudioSource>();
}
void Update()
{
    StartCoroutine(PlaySound());

}

IEnumerator PlaySound()
{
    yield return new WaitForSeconds(Random.Range(10f, 20f));
    audioPlaying = false;
    if (!audioPlaying)
    {
        clipIndex = Random.Range(0, clips.Length - 1);
        audioPlaying = true;
        audio.PlayOneShot(clips[clipIndex], 1f);
    }
    yield return new WaitForSeconds(Random.Range(10f, 20f));
}
}

基本上,在调试时,我发现audioPlaying仍然是正确的,clipIndex不断循环索引。最后,所有的声音都不停地播放,发出很大的嗡嗡声。我的问题是音频播放没有被禁用,因此等待时间不一定有效。谢谢,任何帮助都将不胜感激

您的工作出错,调用了协同程序的每次更新,并设置为假音频播放和播放新声音。 试试这个:

using UnityEngine;
using System.Collections;

public class AudioController : MonoBehaviour
{

[SerializeField] private AudioClip[] clips;
private int clipIndex;
private AudioSource audio;
private bool audioPlaying = false;

void Start()
{
    audio = gameObject.GetComponent<AudioSource>();
}
void Update()
    {

        if (!audio.isPlaying) 
        {

            clipIndex = Random.Range(0, clips.Length - 1);
            audio.clip = clips[clipIndex];
            audio.PlayDelayed(Random.Range(10f, 20f));
            Debug.Log("Nothing playing, we set new audio to " + audio.clip.name);
        }
    }

您的工作错误,调用协同程序的每个更新,并设置为假音频播放和播放新声音。 试试这个:

using UnityEngine;
using System.Collections;

public class AudioController : MonoBehaviour
{

[SerializeField] private AudioClip[] clips;
private int clipIndex;
private AudioSource audio;
private bool audioPlaying = false;

void Start()
{
    audio = gameObject.GetComponent<AudioSource>();
}
void Update()
    {

        if (!audio.isPlaying) 
        {

            clipIndex = Random.Range(0, clips.Length - 1);
            audio.clip = clips[clipIndex];
            audio.PlayDelayed(Random.Range(10f, 20f));
            Debug.Log("Nothing playing, we set new audio to " + audio.clip.name);
        }
    }

因为每一帧你都有这样的东西:

audioPlaying = false;
if (!audioPlaying)
{
    audioPlaying = true;
}
你看到问题了吗?不妨这样:

if (true)
{
    audioPlaying = true;
}
无论如何,您可以尝试:

void Start()
{
    StartCoroutine(PlaySound());
}

IEnumerator PlaySound()
{
    yield return new WaitForSeconds(Random.Range(10f, 20f));

    clipIndex = Random.Range(0, clips.Length - 1);
    audio.PlayOneShot(clips[clipIndex], 1f);

    yield return new WaitForSeconds(clips[clipIndex].length);
    StartCoroutine(PlaySound());
}

因为每一帧你都有这样的东西:

audioPlaying = false;
if (!audioPlaying)
{
    audioPlaying = true;
}
你看到问题了吗?不妨这样:

if (true)
{
    audioPlaying = true;
}
无论如何,您可以尝试:

void Start()
{
    StartCoroutine(PlaySound());
}

IEnumerator PlaySound()
{
    yield return new WaitForSeconds(Random.Range(10f, 20f));

    clipIndex = Random.Range(0, clips.Length - 1);
    audio.PlayOneShot(clips[clipIndex], 1f);

    yield return new WaitForSeconds(clips[clipIndex].length);
    StartCoroutine(PlaySound());
}
易于修复:

using UnityEngine;
using System.Collections;

public class AudioController : MonoBehaviour
{
    public AudioClip[] clips;
    private int clipIndex;
    private AudioSource audio;
    private bool audioPlaying = false;

    void Start()
    {
        audio = gameObject.GetComponent<AudioSource>();
    }
    void Update()
    {
        if (!audio.isPlaying) 
        {
            clipIndex = Random.Range(0, clips.Length - 1);
            audio.clip = clips[clipIndex];
            audio.PlayDelayed(Random.Range(20f, 50f));
            Debug.Log("Nothing playing, we set new audio to " + audio.clip.name);
        }
    }
}
易于修复:

using UnityEngine;
using System.Collections;

public class AudioController : MonoBehaviour
{
    public AudioClip[] clips;
    private int clipIndex;
    private AudioSource audio;
    private bool audioPlaying = false;

    void Start()
    {
        audio = gameObject.GetComponent<AudioSource>();
    }
    void Update()
    {
        if (!audio.isPlaying) 
        {
            clipIndex = Random.Range(0, clips.Length - 1);
            audio.clip = clips[clipIndex];
            audio.PlayDelayed(Random.Range(20f, 50f));
            Debug.Log("Nothing playing, we set new audio to " + audio.clip.name);
        }
    }
}

我仍然有同样的问题。在调试时,我注意到索引仍在每一帧更改,而不会像返回新的WaitForSecondScrips[clipIndex].Length;中那样等待上一个剪辑结束。在这种情况下,我认为这是因为,我们从不管理音频播放,并且默认情况下它总是设置为false。你会把它分配到哪里?是的,我错把它放在里面了,现在试试。注意它现在在Start方法中,而不是像它现在所称的那样进行更新。哇,这太棒了!谢谢你清理它!它现在几乎完美地工作,就像我想要的!我仍然有同样的问题。在调试时,我注意到索引仍在每一帧更改,而不会像返回新的WaitForSecondScrips[clipIndex].Length;中那样等待上一个剪辑结束。在这种情况下,我认为这是因为,我们从不管理音频播放,并且默认情况下它总是设置为false。你会把它分配到哪里?是的,我错把它放在里面了,现在试试。注意它现在在Start方法中,而不是像它现在所称的那样进行更新。哇,这太棒了!谢谢你清理它!它现在几乎完美地工作,就像我想要的!这与我最初做的非常接近,但我注意到audio.isplay不起作用,因为我们从不将剪辑指定给音频源,而是只播放一个剪辑。当我将剪辑分配给音频源时,出现了一系列问题,例如音频循环,以及以前的问题。好的,我尝试修复您的代码。在本例中,使用已编辑的代码。这与我最初所做的非常接近,但我注意到audio.isplay不起作用,因为我们从不将剪辑指定给音频源,而是只播放一个剪辑。当我将剪辑分配给音频源时,出现了一系列问题,例如音频循环,以及以前的问题。好的,我尝试修复您的代码。在这种情况下,请使用已编辑的代码。