我一直在尝试学习Unity中的音频,并且遇到一个问题,即音量增加到明显降低的程度。
声音是由
触发的GetComponent<AudioSource>().PlayOneShot(sound);
似乎有时会被触发多次,从而导致音量增加,有时会出现削波。
我尝试使用Play()
和Stop()
来解决问题,但这导致所有其他音频也被剪切掉了。尝试创建新的音频源并没有取得很大的成功,但这可能是由于我对此领域的知识不足所致。
预防此问题的最佳方法是什么?我可以从一个游戏对象中声明多个音频源,还是应该在其他地方查看?
谢谢!
答案 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();
}