サークル獏の佐藤敏 Unityとか備忘録

サークル獏の佐藤敏がUnityとかで知ったTipsを書いておく備忘録です。

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