【Unity初心者ちょっと脱出くらいの人に】雑だけどまあ動くSimpleSoundManager クラス
「ゲームで音を鳴らしたい!」でもUnityの画面から音声1つずつポチポチ登録するのはしんどい! って人に。
staticで呼び出していたり雑であまり上品な書き方じゃないですが、とりあえず動くとは思います。
使った報告とか著作権表記とかはなくて大丈夫です。改変も自由にしてください。
導入方法
- 以下のコードをコピペしてSimpleSoundManager.csとして保存。
- Unity上でGameObject→Create Emptyで空のオブジェクトを作る。名前は適当でいいです。
- それにSimpleSoundManagerをAdd Componentします。
using System; using System.Collections.Generic; using UnityEngine; //音の種類。必要に応じてテキトーに増やしたり減らしたり public enum AudioSourceType { BGM, UI, SHOT, DAMAGE, VOICE, MAX } public class SimpleSoundManager : MonoBehaviour { static Dictionary<string, AudioClip> dic = new Dictionary<string, AudioClip> (); static AudioSource[] audioSourceAr = new AudioSource[(int) AudioSourceType.MAX]; void Start () { LoadFromFolder ("sounds"); //音声データはResources/soundsフォルダに入れておく for (var i = 0; i < (int) AudioSourceType.MAX; i++) { audioSourceAr[i] = gameObject.AddComponent<AudioSource> (); } } private void LoadFromFolder (string folderName) { var clipAr = Resources.LoadAll<AudioClip> (folderName); foreach (var item in clipAr) { dic[item.name] = item; } } public static void PlaySound (AudioSourceType type, string key) { AudioClip result; if (dic.TryGetValue (key, out result)) { var source = audioSourceAr[(int) type]; source.clip = result; source.loop = (type == AudioSourceType.BGM); //BGMだけはループする source.Play (); //同じ音が複数鳴るようにしたいならPlayOneShot } else { Debug.Log ("音声ファイル" + key + "が見つかりません。"); } } public static void StopSound (AudioSourceType type) { var source = audioSourceAr[(int) type]; source.Stop (); } public static void StopAllSounds () { for (var i = 0; i < (int) AudioSourceType.MAX; i++) { audioSourceAr[i].Stop (); } } //val=1fで最大音量 0.5fで半分とか public static void SetVolume (AudioSourceType type, float val) { var source = audioSourceAr[(int) type]; source.volume = val; } }
実際の音の鳴らし方
まずResourcesフォルダの中にsoundsフォルダを作り、そこに音声データを入れておきます。
使うときは、音を鳴らしたいときに
SimpleSoundManager.PlaySound (AudioSourceType.BGM, "snd勝利曲"); SimpleSoundManager.PlaySound (AudioSourceType.UI, "snd敵復活");
とかしてください。
SimpleSoundManager.SetVolume (AudioSourceType.BGM,0.5f); //BGMの音量を半分に SimpleSoundManager.StopAllSounds (); //全部の音を止める
とかもできます。
よりレベルアップするためには?
Resourcesフォルダに大きなデータをぶちこんでおくと起動時に時間がかかります。
「アセットバンドル」を使いこなせるようになると、データの読み込みがもっとスムーズになるでしょう。
あと、staticで関数を呼び出すのも雑すぎるので「シングルトン」とかを勉強するといいかもしれません。
まあ1人で開発するぶんにはstaticでいい気もしますが……