一、问题
原先写了一个播放背景音乐的类
存在的问题是,只能播放单一的背景音乐,没法播放多个背景音乐。
二、搜索
关键词“unity3d multi audio manager”
http://www.blog.silentkraken.com/2010/04/06/audiomanager/
三、代码
using UnityEngine;
using System.Collections;
/// <summary>
/// Filename: AudioManager.cs
/// Description: Manager of ground music
/// Author: Star
/// Date: [12/4/31]
/// </summary>
public class AudioManager : MonoBehaviour {
private static AudioManager instance = null;
public AudioSource m_AudioMgr;
private AudioClip m_PlayClip;
private string m_CurMusicName = "";
public static AudioManager Instance
{
get
{
return instance;
}
}
void Awake()
{
if (instance != null && instance != this)
{
Destroy(this.gameObject);
}
else
{
instance = this;
}
DontDestroyOnLoad(this.gameObject);
}
/// <summary>
/// Play the background music which will go through the scene.
/// </summary>
/// <param name='fileName'>
/// File name.
/// </param>
public void PlayBG(string fileName)
{
if (!fileName.Equals(m_CurMusicName))
{
m_PlayClip = Resources.Load("Audio/Source/BGMusic/"+fileName) as AudioClip;
m_AudioMgr.clip = m_PlayClip;
m_AudioMgr.Play();
m_CurMusicName = fileName;
}
Debug.Log("AudioManager::Play()");
}
/// <summary>
/// Play the background music which will go through the scene.
/// </summary>
/// <param name='m_PlayClip'>
/// M_ play clip.
/// </param>
public void PlayBG(AudioClip m_PlayClip)
{
m_AudioMgr.clip = m_PlayClip;
m_AudioMgr.Play();
}
/// <summary>
/// Stops the background music.
/// </summary>
public void StopBG()
{
m_AudioMgr.Stop();
m_CurMusicName = "";
Debug.Log("Stop bm_PlayClipkground music");
}
public AudioSource Play(AudioClip clip, Transform emitter, bool loop)
{
return Play(clip, emitter, 1f, 1f, loop);
}
public AudioSource Play(AudioClip clip, Transform emitter, float volume, bool loop)
{
return Play(clip, emitter, volume, 1f, loop);
}
/// <summary>
/// Plays a sound by creating an empty game object with an AudioSource
/// and attaching it to the given transform (so it moves with the transform).
/// Destroys it after it finished playing if it dosen't loop.
/// </summary>
/// <param name='clip'>
/// Clip.
/// </param>
/// <param name='emitter'>
/// Emitter.
/// </param>
/// <param name='volume'>
/// Volume.
/// </param>
/// <param name='pitch'>
/// Pitch.
/// </param>
/// <param name='loop'>
/// Loop.
/// </param>
public AudioSource Play(AudioClip clip, Transform emitter, float volume, float pitch, bool loop)
{
GameObject go = new GameObject("Audio:"+clip.name);
go.transform.position = emitter.position;
go.transform.parent = emitter;
// create the source
AudioSource source = go.AddComponent<AudioSource>();
source.clip = clip;
source.volume = volume;
source.pitch = pitch;
source.loop = loop;
if (!loop)
{
Destroy(go, clip.length);
}
return source;
}
public AudioSource Play(AudioClip clip, Vector3 point, bool loop)
{
return Play(clip, point, 1f, 1f, loop);
}
public AudioSource Play(AudioClip clip, Vector3 point, float volume, bool loop)
{
return Play(clip, point, volume, 1f, loop);
}
/// <summary>
/// Plays a sound at the given point in space by creating an empty game object with an AudioSource
/// in that place and destroys it after it finished playing if it dosen't loop.
/// </summary>
/// <param name='clip'>
/// Clip.
/// </param>
/// <param name='point'>
/// Point.
/// </param>
/// <param name='volume'>
/// Volume.
/// </param>
/// <param name='pitch'>
/// Pitch.
/// </param>
/// <param name='loop'>
/// Loop.
/// </param>
public AudioSource Play(AudioClip clip, Vector3 point, float volume, float pitch, bool loop)
{
GameObject go = new GameObject("Audio:" + clip.name);
go.transform.position = point;
AudioSource source = go.AddComponent<AudioSource>();
source.clip = clip;
source.volume = volume;
source.pitch = pitch;
source.loop = loop;
if (!loop)
{
DestroyObject(go, clip.length);
}
return source;
}
}
四、总结
1.不足:无法播放多个跨场景的背景音乐(有些背景音乐可能是合成音乐),这个用类似的动态创建不删除的物体声音源也是可能解决的,只是我们现在不需要。
来源:https://www.cnblogs.com/gameprogram/archive/2012/08/15/2640357.html