单例:单例形式有两种,一种是继承mono的单例,一种是不继承mono的单例
继承mono的单例
using UnityEngine;
using System.Collections;
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
#region 单例
private static T instance;
public static T Instance {
get {
if (instance == null) {
GameObject obj = new GameObject (typeof(T).Name);
instance = obj.AddComponent<T> ();
}
return instance;
}
}
#endregion
protected virtual void Awake ()
{
instance = this as T;
}
}
不继承mono的单例
using UnityEngine;
using System.Collections;
public abstract class Singleton<T> : System.IDisposable where T : new()
{
private static T instance;
public static T Instance {
get {
if (instance == null) {
instance = new T ();
}
return instance;
}
}
public virtual void Dispose ()
{
}
}
音效管理类
using UnityEngine;
using System.Collections;
public class MusicMgr : MonoSingleton<MusicMgr>
{
// 播放背景音乐
private AudioSource m_bgMusic;
// 播放音效
private AudioSource m_effectMusic;
// 控制音量大小
public float BgVolume {
get{ return m_bgMusic.volume; }
set{ m_bgMusic.volume = value; }
}
public float EffectVolmue {
get{ return m_effectMusic.volume; }
set{ m_effectMusic.volume = value; }
}
protected override void Awake ()
{
base.Awake ();
m_bgMusic = gameObject.AddComponent<AudioSource> ();
m_bgMusic.loop = true;
m_bgMusic.playOnAwake = false;
m_effectMusic = gameObject.AddComponent<AudioSource> ();
m_effectMusic.loop = true;
m_effectMusic.playOnAwake = false;
}
// 播放背景音乐
private void PlayBgBase (object bgName, bool restart = false)
{
string curBgName = string.Empty;
if (m_bgMusic.clip != null) {
curBgName = m_bgMusic.clip.name;
}
// 根据用户的音频片段名称, 找到AuioClip, 然后播放
AudioClip clip = ResourcesMgr.Instance.Load<AudioClip> (bgName);
if (clip != null) {
if (clip.name == curBgName && !restart) {
return;
}
m_bgMusic.clip = clip;
m_bgMusic.Play ();
} else {
// 异常, 调用写日志的工具类.
UnityEngine.Debug.Log ("没有找到音频片段");
}
}
public void PlayBg (MusicType.Feeds bgName, bool restart = false)
{
PlayBgBase (bgName, restart);
}
public void PlayBg (MusicType.Items bgName, bool restart = false)
{
PlayBgBase (bgName, restart);
}
public void PlayBg (MusicType.Main bgName, bool restart = false)
{
PlayBgBase (bgName, restart);
}
public void PlayBg (MusicType.Monsters bgName, bool restart = false)
{
PlayBgBase (bgName, restart);
}
public void PlayBg (MusicType.Towers bgName, bool restart = false)
{
PlayBgBase (bgName, restart);
}
// 播放音效
private void PlayEffectBase (object effectName, bool defAudio = true, float volume = 1f)
{
AudioClip clip = ResourcesMgr.Instance.Load<AudioClip> (effectName);
if (clip == null) {
UnityEngine.Debug.Log ("没有找到音效片段");
return;
}
if (defAudio) {
m_effectMusic.PlayOneShot (clip, volume);
} else {
AudioSource.PlayClipAtPoint (clip, Camera.main.transform.position, volume);
}
}
public void PlayEffect (MusicType.Feeds effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase (effectName, defAudio, volume);
}
public void PlayEffect (MusicType.Items effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase (effectName, defAudio, volume);
}
public void PlayEffect (MusicType.Main effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase (effectName, defAudio, volume);
}
public void PlayEffect (MusicType.Monsters effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase (effectName, defAudio, volume);
}
public void PlayEffect (MusicType.Towers effectName, bool defAudio = true, float volume = 1f)
{
PlayEffectBase (effectName, defAudio, volume);
}
}
资源管理类
using UnityEngine;
using System.Collections;
// 通过用户传递进来的枚举值, 自动的分析出该枚举值对应的资源在哪个路径下.
public class ResourcesMgr : Singleton<ResourcesMgr>
{
// 面向用的方法:
/// <summary>
/// 返回用户需要的资源.
/// </summary>
/// <param name="enumName">Enum name.</param>
/// <typeparam name="T">The 1st type parameter.</typeparam>
public T Load<T> (object enumName) where T : Object
{
// 获取枚举类型的字符串形式
string enumType = enumName.GetType ().Name;
string filePath = string.Empty;
switch (enumType) {
case "Feeds":
{
filePath = "Music/Feeds/" + enumName.ToString ();
break;
}
case "Items":
{
filePath = "Music/Items/" + enumName.ToString ();
break;
}
case "Main":
{
filePath = "Music/Main/" + enumName.ToString ();
break;
}
case "Monsters":
{
filePath = "Music/Monsters/" + enumName.ToString ();
break;
}
case "Towers":
{
filePath = "Music/Towers/" + enumName.ToString ();
break;
}
default:
{
break;
}
}
return Resources.Load<T> (filePath);
}
}
定义的枚举.用来存放音乐的string(把音频放在Resource文件夹下的Music下的Feeds文件夹下)
public class MusicType
{
public enum Feeds
{
BuyItem,
Feed01,
}
public enum Items
{
Ach,
BGMusic01,
BGMusic02,
BGMusic03,
}
public enum Main
{
Accomplish,
BGMusic,
}
public enum Monsters
{
BigBoss,
Fat141,
}
public enum Towers
{
Anchor,
Arrow,
}
}
//用来调用脚本
using UnityEngine;
using System.Collections;
public class GameController : MonoBehaviour
{
void Update ()
{
if (Input.GetKeyDown (KeyCode.B)) {
MusicMgr.Instance.PlayBg (MusicType.Main.BGMusic);
}
if (Input.GetKeyDown (KeyCode.E)) {
MusicMgr.Instance.PlayEffect (MusicType.Towers.Bottle);
}
}
}
音频资源的配置