AudioSource.PlayOneShot音量增加和剪辑

时间:2018-11-27 01:53:58

标签: unity3d audio

我一直在尝试学习Unity中的音频,并且遇到一个问题,即音量增加到明显降低的程度。

声音是由

触发的
GetComponent<AudioSource>().PlayOneShot(sound);

似乎有时会被触发多次,从而导致音量增加,有时会出现削波。

我尝试使用Play()Stop()来解决问题,但这导致所有其他音频也被剪切掉了。尝试创建新的音频源并没有取得很大的成功,但这可能是由于我对此领域的知识不足所致。

预防此问题的最佳方法是什么?我可以从一个游戏对象中声明多个音频源,还是应该在其他地方查看?

谢谢!

2 个答案:

答案 0 :(得分:1)

您是否要为要播放声音的每个游戏对象使用音频源?如果是这样,请尝试创建一个仅包含音频源组件的单个游戏对象(称为“音频源持有人”)。

请记住,您可以引用此Audio Source组件,并从要触发声音的脚本中调用PlayOneShot(sound)。

例如,假设每次发射子弹时,我们要播放声音:

public class Bullet : MonoBehaviour {
     // This AudioSource reference comes from the Audio Source Holder gameobject
     public AudioSource audioSource;

     public void PlayFireSound(){
         audioSource.PlayOneShot(sound);
     }
}

希望以上帮助。您还可以查看一下question,其中音频文件被更改为未压缩的格式(如.wav),以查看问题是否得到解决。

答案 1 :(得分:1)

设法解决了! 问题是,只有一个音频源可用。因此,解决方案是创建第二个音频源,并在脚本中使用

public AudioSource[] sounds;

void PlaySound (AudioClip sound)
{
    sounds = GetComponents<AudioSource>();
    AudioSource audioSource = sounds[1]; //Using the second AudioSource
    audioSource.clip = sound;
    audioSource.Stop(); //Stop any previous audio from playing
    audioSource.Play();

}

非常感谢您-https://answers.unity.com/questions/52017/2-audio-sources-on-a-game-object-how-use-script-to.html

编辑:改进的代码。上面的代码再次一次只允许播放一个剪辑,因此我决定更进一步,并在每个剪辑开始播放时为其创建代码。这是最终代码

public Dictionary<string,AudioSource> sounds = new Dictionary<string, AudioSource>();

void PlayOneShotSound (AudioClip sound)
{
    //Check if AudioSource has been created for this clip
    if (!sounds.ContainsKey(sound.name)) 
    {
        sounds.Add(sound.name, gameObject.AddComponent<AudioSource>());
    }
    AudioSource audioSource = sounds[sound.name]; //Using AudioSource for the clip

    audioSource.clip = sound;

    audioSource.Stop(); //Preventing previous sound from being played
    audioSource.Play();
}