Unity中随机间隔上的随机音频

Posted

技术标签:

【中文标题】Unity中随机间隔上的随机音频【英文标题】:Random Audio Over Random Interval In Unity 【发布时间】:2015-08-12 15:00:00 【问题描述】:

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

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 不断循环遍历索引。最终,所有的声音都不停地播放并发出巨大的嗡嗡声。我的问题是 audioPlaying 未被禁用,因此等待时间不一定有效。谢谢,任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

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

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);
        
    

【讨论】:

这与我最初所做的非常接近,但我注意到 audio.isPlaying 不起作用,因为我们从未将剪辑分配给 AudioSource 而只是播放剪辑。当我将剪辑分配给 AudioSource 时,出现了另一组问题,例如循环音频,以及之前的相同问题。 好的,我尝试修复你的代码。在这种情况下,使用编辑后的代码。【参考方案2】:

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

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());

【讨论】:

我仍然有同样的问题。当我调试时,我注意到索引仍然在每一帧都发生变化,而不是等待前一个剪辑结束(就像在 yield return new WaitForSeconds(clips[clipIndex].Length); 中所做的那样)。在这种情况下,我认为是因为,我们从不管理音频播放,并且默认情况下始终设置为 false。你会把它分配到哪里? 是的,我把它弄错了,现在试试。请注意它现在在 Start() 方法中,而不是 Update(),因为它现在自称。 哇,这太棒了!感谢您清理它!它现在几乎完全符合我的要求!【参考方案3】:

易于修复:

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);
        
    

【讨论】:

以上是关于Unity中随机间隔上的随机音频的主要内容,如果未能解决你的问题,请参考以下文章

以随机间隔运行函数C# [重复]

在love2d中以随机时间间隔调用lua函数

GUI之间具有随机间隔

按随机间隔选择tibble中的行

Unity Viewbob 使用 lerp 随机回弹 1 帧

在rxjs6中以随机间隔生成值流?