unityの音(特にSE)めんどくさいですよね。
テキスト通りの流れだと
ゲームオブジェクトに効果音入れる
オブジェクトに効果音を鳴らすプログラムを入れる
AudioSource audio;
AudioClip se;
audio = GetComponent<AudioSource>();
audio.PlayOneShot(se);
↑こんなかんじのやつ
これを鳴らしたいオブジェクトにすべて入れてたらめんどくさくてしょうがない
なのでAudioManagerというものを作って、すべての効果音をここからならせばいいと思って作ってみました
メリット
・AudioManagerにすべての効果音を入れているので管理しやすい
・上記のプログラムをいちいち、鳴らしたいオブジェクトごとに書かなくて済む
デメリット
・AudioManagerからすべての音を鳴らしているので、3dSoundが使えない(AudioManagerを鳴らしたい位置に動かせばできなくはないけどめんどい)
それではメインのプログラム
static AudioSource g_Audio; //AudioSourceコンポーネント
[SerializeField,Header("音データ")] AudioClip[] audioClips; //音データ
[SerializeField, Header("音名前(添え字)")] string[] SEName; //音の名前,配列の添え字用
static Dictionary<string, AudioClip> SEs = new Dictionary<string, AudioClip>(); //SEディクショナリリスト
private void Awake()
{
g_Audio = GetComponent<AudioSource>(); //AudioSourceを手に入れる
for (int i = 0; i < audioClips.Length; i++) //音データの要素分だけループ
{
SEs.Add(SEName[i], audioClips[i]); //SEディクショナリリストに音データと音の名前を入れる
}
}
/// <summary>
/// 音を鳴らすプログラム
/// </summary>
/// <param name="name">鳴らしたい音の名前</param>
static public void PlaySE(string name)
{
g_Audio.PlayOneShot(SEs[name]);
}
プログラム解説
Dictionaryという超便利なものがあります。(連想配列で検索)
keyとvalueが結びついている特性を生かして、効果音の名前と効果音本体を結びつけて手軽にインスペクター上から編集できる
効果音リスト作ってみました。
こんな感じで音のデータと音の名前を入れます(順番は一致させる必要あり)
後は鳴らしたいところで以下のようなプログラムをうつと音が鳴ります
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Field")&& g_PlayerCS.GetVelocity().y==0)
{
//()のなかに鳴らしたい音の名前を入れる
AudioManger.PlaySE("着地音");
}
}
ゲームデザイナーに音をAudioManagerに入れてもらって、プログラマーがseならせばいいだけなので簡単@
添え字の名前が食い違う事故起こりそうだからここをいい感じに事故らない方法募集してます。