using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using NTFrame;
public class MusicCallBackInfo
{
public float mTime;
public CommonDelegate.VoidDelegate mFunc = null;
public bool bFinished = false;
private void Finished()
{
if(mFunc != null)
mFunc();
}
public MusicCallBackInfo(float time, CommonDelegate.VoidDelegate func)
{
mTime = time;
mFunc = func;
bFinished = (time <= 0);
if(bFinished)
{
Finished();
}
}
public void Update()
{
if(mTime > 0)
{
mTime-= Time.deltaTime;
if(mTime <= 0)
{
Finished();
}
}
}
public bool GetIsFinished()
{
return bFinished;
}
}
public class MusicManager : SingletonMono<MusicManager> {
private AudioSource audio = null;
private Hashtable sounds = new Hashtable();
private Hashtable mMutexEffects = new Hashtable();
private delegate void LoadFunc(AudioClip clip);
private List<MusicCallBackInfo> mInfos = new List<MusicCallBackInfo>();
private string mSaveMusic = "";
private float mSaveMusicInitVolume;
void Awake() {
InitComponent();
}
private void InitComponent()
{
if(audio != null)
return;
if(Camera.main == null)
return;
audio = Camera.main.GetComponent<AudioSource>();
if(audio == null)
{
audio = Camera.main.gameObject.AddComponent<AudioSource>();
}
}
private void Add(string key, AudioClip value) {
if (sounds[key] != null || value == null) return;
sounds.Add(key, value);
}
private AudioClip GetInLoaded(string key) {
if (key == null)
return null;
if (sounds[key] == null) return null;
return sounds[key] as AudioClip;
}
private void LoadAudioClip(string assetbundleName , string assetName ,LoadFunc func) {
AudioClip ac = GetInLoaded(assetName);
if (ac == null) {
StartCoroutine(OnLoadAudioClip(assetbundleName,assetName,delegate(AudioClip clip) {
if(clip != null)
{
ac = clip;
Add(assetName,clip);
}
if(func != null)
func(clip);
}));
}
else
{
if(func != null)
func(ac);
}
}
IEnumerator OnLoadAudioClip(string assetbundleName,string assetName,LoadFunc func)
{
yield return StartCoroutine(ResourceManager.Instance.Load<GameObject>(assetbundleName, assetName));
AudioClip clip = ResourceManager.Instance.GetLoadedAsset(assetbundleName) as AudioClip;
if(func != null)
func(clip);
AssetBundleManager.UnLoadMainAssetBundle(assetbundleName);
}
#region backsound function
public bool CanPlayBackSound() {
string key = "SoundBackSound";
int i = PlayerPrefs.GetInt(key, 1);
return i == 1;
}
public void SetPlayBackSound(bool backsoundOn)
{
if(CanPlayBackSound() == backsoundOn)
return;
int value = backsoundOn ? 1 : 0;
string key = "SoundBackSound";
PlayerPrefs.SetInt(key, value);
TrueJudgeOpenBackground(backsoundOn);
}
private void TrueJudgeOpenBackground(bool backsoundOn)
{
if (backsoundOn == true)
{
if (mSaveMusic != "")
PlayBacksound(mSaveMusic, mSaveMusicInitVolume);
}
else
{
StopBacksound();
}
}
public void PlayBacksound(string name,float volume = 0.5f) {
if(string.IsNullOrEmpty(name))
{
return;
}
mSaveMusic = name;
mSaveMusicInitVolume = volume;
float v = GetMusicVolume();
volume = volume * v;
if (!CanPlayBackSound())
return;
InitComponent();
if(audio == null)
return;
LoadAudioClip(StringDefine.AudioPath + name,name,delegate(AudioClip clip) {
if(clip != null)
{
audio.loop = true;
audio.clip = clip;
audio.Play();
audio.volume = volume;
}
});
}
public void StopBacksound()
{
InitComponent();
if(audio == null)
return;
audio.Stop();
audio.clip = null;
ClientTools.ClearMemory();
}
#endregion
#region soundeffect function
public bool CanPlaySoundEffect() {
string key = "SoundEffect";
int i = PlayerPrefs.GetInt(key, 1);
return i == 1;
}
public void SetPlaySoundEffect(bool effectOn)
{
int value = effectOn ? 1 : 0;
string key = "SoundEffect";
PlayerPrefs.SetInt(key, value);
}
public void PlaySoundEffect(string name,Transform position,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
if (position != null)
OnPlayEffect ("",name, position.position,delay,loop,volume);
}
public void PlaySoundEffect(string name,GameObject obj,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
if (obj != null)
OnPlayEffect ("",name, obj.transform.position,delay,loop,volume);
}
public void PlaySoundEffect(string name,Vector3 position,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
OnPlayEffect("",name,position,delay,loop,volume);
}
public void PlaySoundEffect(string name,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
Vector3 pos = Vector3.zero;
if(audio != null)
{
InitComponent();
if(audio !=null)
{
pos = audio.transform.position;
}
}
OnPlayEffect("",name, pos,delay,loop,volume);
}
#endregion
#region mutex effect function
public void PlayMutextSoundEffect(string layer,string name,Transform position,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
if (position != null)
OnPlayEffect (layer,name, position.position,delay,loop,volume);
}
public void PlayMutextSoundEffect(string layer,string name,GameObject obj,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
if (obj != null)
OnPlayEffect (layer,name, obj.transform.position,delay,loop,volume);
}
public void PlayMutextSoundEffect(string layer,string name,Vector3 position,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
OnPlayEffect(layer,name,position,delay,loop,volume);
}
public void PlayMutextSoundEffect(string layer,string name,float delay = 0f, bool loop = false , float volume = 1.0f)
{
if(name == "")
return;
Vector3 pos = Vector3.zero;
if(audio != null)
{
InitComponent();
if(audio !=null)
{
pos = audio.transform.position;
}
}
OnPlayEffect(layer,name, pos,delay,loop,volume);
}
public void StopMutexSoundEffet(string layer)
{
if(layer == "")
{
//quanbu qingkong
foreach(AudioSource value in mMutexEffects.Values)
{
if(value != null)
{
value.Stop();
value.clip = null;
Destroy(value.gameObject);
}
}
mMutexEffects.Clear();
}
else if(mMutexEffects.Contains(layer))
{
AudioSource sourc = mMutexEffects[layer] as AudioSource;
if(sourc != null)
{
sourc.Stop();
sourc.clip = null;
Destroy(sourc.gameObject);
}
mMutexEffects.Remove(layer);
}
}
#endregion
private void OnPlayEffect(string layer,string name,Vector3 position,float delay,bool loop,float volume)
{
if(name == "")
return;
float v = GetSoundEffectVolume();
volume = volume * v;
if (!CanPlaySoundEffect()) return;
LoadAudioClip (StringDefine.AudioPath + name,name,delegate(AudioClip clip) {
PlayWithDelay (layer,clip, position,delay,loop,volume);
});
}
private void PlayWithDelay(string layer,AudioClip clip, Vector3 position,float delay,bool loop,float volume)
{
if(clip == null)
return;
MusicCallBackInfo info = new MusicCallBackInfo(delay,delegate() {
Play(layer,clip,position,loop,volume);
});
mInfos.Add(info);
}
private void Play(string layer,AudioClip clip, Vector3 position,bool loop,float volume) {
if(clip == null)
return;
if (!CanPlaySoundEffect()) return;
if(layer != "")
{
StopMutexSoundEffet(layer);
}
PlayClipAtPoint(layer,clip, position,loop,volume);
}
private void PlayClipAtPoint(string layer, AudioClip clip, Vector3 position, bool loop, float volume)
{
GameObject gameObject = new GameObject("One shot audio");
gameObject.transform.position = position;
if(audio != null)
gameObject.transform.SetParent(audio.transform);
AudioSource audioSource = (AudioSource)gameObject.AddComponent(typeof(AudioSource));
audioSource.clip = clip;
audioSource.spatialBlend = 1f;
audioSource.volume = volume;
audioSource.Play();
audioSource.loop = loop;
float ftime = clip.length * ((Time.timeScale >= 0.01f) ? Time.timeScale : 0.01f);
bool isMutex = (layer != "");
if(isMutex)
{
mMutexEffects[layer] = audioSource;
gameObject.name = layer + "sound effext";
}
else if(!loop)
{
Object.Destroy(gameObject,ftime);
}
}
#region volume
/// <summary>
/// 设置音效声音
/// </summary>
public void SetSoundEffectVolume(float v)
{
string key = "SoundEffectVolume";
PlayerPrefs.SetFloat(key, v);
}
public float GetSoundEffectVolume()
{
string key = "SoundEffectVolume";
return PlayerPrefs.GetFloat(key, 1.0f);
}
/// <summary>
/// 设置背景音乐声音
/// </summary>
public void SetMusicVolume(float v)
{
string key = "MusicVolume";
PlayerPrefs.SetFloat(key, v);
if (audio != null)
audio.volume = mSaveMusicInitVolume * GetMusicVolume();
}
public float GetMusicVolume()
{
string key = "MusicVolume";
return PlayerPrefs.GetFloat(key, 1.0f);
}
#endregion
private void Update()
{
if(mInfos.Count > 0)
{
bool changed = false;
List<MusicCallBackInfo> tempInfos = new List<MusicCallBackInfo>();
for(int i = 0 ; i < mInfos.Count ; i++)
{
if(mInfos[i].GetIsFinished())
{
changed = true;
}
else
{
tempInfos.Add(mInfos[i]);
}
}
if(changed)
{
mInfos = tempInfos;
}
for(int i = 0 ; i < mInfos.Count ; i++)
{
mInfos[i].Update();
}
}
}
public void ClearAllMemory()
{
mMutexEffects.Clear();
sounds.Clear();
ClientTools.ClearMemory();
}
}
MusicManager
最新推荐文章于 2024-02-12 18:38:42 发布