【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でいい気もしますが……