Unityはサウンドを鳴らすのもマネージャーなんてなくてもとても便利。

でもあるに越したことはない、ということで以前作ったオーディオマネージャー

忘れないようにソースコードを載せておく。

 

 

//AudioMgrについて
//1.サウンド素材の置く場所:BGM(Assets/Resources/Sounds/BGM) SE(Assets/Resources/Sounds/SE)
//2.使いたいシーンにAudioMgrプレハブを配置する(Assets/Prefub/Audio/AudioMgr)
//3.サウンドをロードする:start()の中にAudioMgr.LoadBgm("名前(何でもok)","ファイル名(1に格納したファイルの名前、.mp3とかいらない)");
//                                  AudioMgr.LoadSe ("名前","ファイル名");
//4.鳴らしたいタイミングで:AudioMgr.PlayBgm("名前(3で付けたもの)");
//              AudioMgr.PlaySe("名前");
//5.他の機能について: AudioMgr.StopBgm();
//                   AudioMgr.StopSe();
//                   AudioMgr.PauseSe();途中で止まる
//                   AudioMgr.ReplaySe();再開する(PauseSeとセットになってる)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class AudioMgr : AudioSingletonMonoBehaviour<AudioMgr>
{

    /// SEチャンネル数
    const int SE_CHANNEL = 4;

    /// サウンド種別
    enum eType
    {
        Bgm, // BGM
        Se,  // SE
    }
    // オーディオソース

    AudioSource mBGMSource = null; // BGM
    AudioSource mSESource = null; // SE (デフォルト)
    AudioSource[] mSESourceArray; // SE (チャンネル)

    // BGMにアクセスするためのテーブル
    Dictionary<string, AudioClip> mBGMPool = new Dictionary<string, AudioClip>();
    // SEにアクセスするためのテーブル
    Dictionary<string, AudioClip> mSEPool = new Dictionary<string, AudioClip>();

    //public List<AudioClip> mBGMClip = new List<AudioClip>();
    //public List<AudioClip> mSEClip = new List<AudioClip>();

    // サウンド再生のためのゲームオブジェクト
    //GameObject _object = null;

    /// コンストラクタ
    public AudioMgr()
    {
        // チャンネル確保
        mSESourceArray = new AudioSource[SE_CHANNEL];

    }

    public new void Awake()
    {
        base.Awake();
        //オーディオリスナーを生成
        //gameObject.AddComponent<AudioListener>();

        // AudioSourceを作成
        mBGMSource = gameObject.AddComponent<AudioSource>();
        mSESource = gameObject.AddComponent<AudioSource>();
        for (int i = 0; i < SE_CHANNEL; i++)
            mSESourceArray[i] = gameObject.AddComponent<AudioSource>();
    }
    /// AudioSourceを取得する
    AudioSource _GetAudioSource(eType type, int channel = -1)
    {

        if (type == eType.Bgm)
        {
            // BGM
            return mBGMSource;
        }
        else
        {
            // SE
            if (0 <= channel && channel < SE_CHANNEL)
            {
                // チャンネル指定
                return mSESourceArray[channel];
            }
            else
            {
                // デフォルト
                return mSESource;
            }
        }
    }

    // サウンドのロード
    // ※Resources/Soundsフォルダに配置すること
    public static void LoadBgm(string key, string resName)
    {
        Instance._LoadBgm(key, resName);
    }
    public static void LoadBgmAsync(string key, string resName)
    {
        Instance._LoadBgmAsync(key, resName);
    }
    public static void LoadSe(string key, string resName)
    {
        Instance._LoadSe(key, resName);
    }
    void _LoadBgm(string key, string resName)
    {
        if (mBGMPool.ContainsKey(key))
        {
            return;
            // すでに登録済みなのでいったん消す
            mBGMPool.Remove(key);
        }
        mBGMPool.Add(key, Resources.Load<AudioClip>("Sounds/BGM/" + resName));
    }
    void _LoadBgmAsync(string key, string resName)
    {
        if (mBGMPool.ContainsKey(key))
        {
            return;
            // すでに登録済みなのでいったん消す
            mBGMPool.Remove(key);
        }
        StartCoroutine(LoadAsync(key, resName));
    }

    IEnumerator LoadAsync(string key, string resName)
    {
        ResourceRequest res;
        res = Resources.LoadAsync<AudioClip>("Sounds/BGM/" + resName);

        while (res.isDone == false)
            yield return null;

        //以下読み込み終了後の処理
        mBGMPool.Add(key, res.asset as AudioClip);
    }

    void _LoadSe(string key, string resName)
    {
        if (mSEPool.ContainsKey(key))
        {
            return;
            // すでに登録済みなのでいったん消す
            //mSEPool.Remove(key);
        }
        mSEPool.Add(key, Resources.Load("Sounds/SE/" + resName) as AudioClip);
    }

    /// BGMの再生
    /// ※事前にLoadBgmでロードしておくこと
    public static bool PlayBgm(string key)
    {
        return Instance._PlayBgm(key);
    }
    bool _PlayBgm(string key)
    {
        if (mBGMPool.ContainsKey(key) == false)
        {
            // 対応するキーがない
            return false;
        }

        // いったん止める
        _StopBgm();

        // リソースの取得
        //AudioClip clip = mBGMPool[key];

        // 再生
        var source = _GetAudioSource(eType.Bgm);
        source.loop = true;
        source.clip = mBGMPool[key];
        source.Play();

        return true;
    }
    /// BGMの停止
    public static bool StopBgm()
    {
        return Instance._StopBgm();
    }
    bool _StopBgm()
    {
        _GetAudioSource(eType.Bgm).Stop();

        return true;
    }

    /// SEの再生
    /// ※事前にLoadSeでロードしておくこと
    public static bool PlaySe(string key, int channel = -1)
    {
        return Instance._PlaySe(key, channel);
    }
    bool _PlaySe(string key, int channel = -1)
    {
        if (mSEPool.ContainsKey(key) == false)
        {
            // 対応するキーがない
            return false;
        }

        // リソースの取得
        //var _data = mSEPool[key];

        if (0 <= channel && channel < SE_CHANNEL)
        {
            // チャンネル指定
            var source = _GetAudioSource(eType.Se, channel);
            source.clip = mSEPool[key];
            source.Play();
        }
        else
        {
            // デフォルトで再生
            var source = _GetAudioSource(eType.Se);
            source.PlayOneShot(mSEPool[key]);
        }

        return true;
    }
    /// BGMの停止
    public static bool StopSe(int _channnel = -1)
    {
        return Instance._StopSe(_channnel);
    }
    bool _StopSe(int _channnel = -1)
    {
        _GetAudioSource(eType.Se, _channnel).Stop();
        return true;
    }
    public static bool PauseSe(int _channnel = -1)
    {
        return Instance._PauseSe(_channnel);
    }
    bool _PauseSe(int _channnel = -1)
    {
        _GetAudioSource(eType.Se, _channnel).Pause();
        return true;
    }
    public static bool ReplaySe(int _channnel = -1)
    {
        return Instance._ReplaySe(_channnel);
    }
    bool _ReplaySe(int _channnel = -1)
    {
        _GetAudioSource(eType.Se, _channnel).UnPause();
        return true;
    }
}

 

 

以上。コメントが少ない。