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;
}
}
以上。コメントが少ない。