MusicManager

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值