【Unity】BGM,SEをとりあえず再生したい人へ


まだ荒削りですがとりあえず掲載しておきます。

やりたかったこと
  • スクリプトで動的にBGM, SEを再生、切り替える
  • Resources 配下の音楽ファイルを再生
  • シーンが切り替わってもBGMは再生し続ける
  • SEが再生し終わったらSEオブジェクトを削除する
動作環境
  • OS : Windows10
  • Unity : 2018.2.0
  • AndroidStudio : 3.1.3

Assets配下の以下のディレクトリに音楽関連ファイルを配置

  • AudioMixier は Audio 配下に
    • AudioMixier についてご存じない方は他の方の記事を参考にしてください。。。(丸投げ)
  • oggファイルなどの音楽ファイルは Audio/BGM または Audio/SE 配下
SoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;

public class SoundManager : MonoBehaviour{

    public AudioMixer audioMixier;
    public AudioSource audioSource;
    public AudioClip bgmClip;
    GameObject soundPlayerObj;

    long lSEID;
    List<GameObject> cntSEObject;

    public SoundManager() {
        lSEID = 0;
        cntSEObject = new List<GameObject>();

        if (GameObject.Find("soundPlayer") == null)
        {
            bgmClip = Resources.Load<AudioClip>("Audio/BGM/game_maoudamashii_3_theme01");
            soundPlayerObj = new GameObject();
            soundPlayerObj.name = "soundPlayer";
            audioSource = soundPlayerObj.AddComponent<AudioSource>();
            audioSource.clip = bgmClip;

            audioMixier = Resources.Load<AudioMixer>("Audio/AudioMixer");
            audioSource.outputAudioMixerGroup = audioMixier.FindMatchingGroups("BGM")[0];

            audioSource.loop = true;
            audioSource.Play();
            DontDestroyOnLoad(soundPlayerObj);
        }
    }

    public void changeBGM(string bgmName)
    {


        // Debug.Log("changeBGM : " + bgmName);
        if (soundPlayerObj == null)
        {
            // Debug.Log("soundPlayerObj is null");
            soundPlayerObj = GameObject.Find("soundPlayer");
        }

        audioSource = soundPlayerObj.GetComponent<AudioSource>();

        if (audioSource.clip.name == bgmName)
        {
            // すでに再生中なら変えない
            return;
        }

        bgmClip = Resources.Load<AudioClip>("Audio/BGM/" + bgmName);
        audioSource.clip = bgmClip;
        audioSource.Stop();
        audioSource.Play();
    }

    public void playSE(string seName)
    {
        Debug.Log("playSE : " + seName);
        GameObject seSoundObject = new GameObject();
        seSoundObject.name = "seSoundObject_" + lSEID.ToString();
        lSEID++;
        cntSEObject.Add(seSoundObject);

        AudioSource seAudioSource = seSoundObject.AddComponent<AudioSource>();
        if (audioMixier == null)
        {
            audioMixier = Resources.Load<AudioMixer>("Audio/AudioMixer");
        }
        seAudioSource.outputAudioMixerGroup = audioMixier.FindMatchingGroups("SE")[0];

        AudioClip seClip = Resources.Load<AudioClip>("Audio/SE/" + seName);
        seAudioSource.clip = seClip;
        seAudioSource.Play();

        destroyStopSE();

    }

    public void destroyStopSE()
    {
        foreach (GameObject seObject in cntSEObject)
        {
            if (seObject != null)
            {
                if (seObject.GetComponent<AudioSource>().isPlaying == false)
                {
                    Destroy(seObject);
                }
            }
        }
        cntSEObject.RemoveAll(item => item == null);
    }

}

上記の SoundManager クラスをシングルトンのクラスで管理
以下は Data クラスというシングルトンに配置している場合(SoundManager 自体をシングルトンで管理してもいいかも)

Data.Instance.soundManager.playSE("再生したいSEの音楽ファイル名(拡張子不要)");
Data.Instance.soundManager.changeBGM("再生したいBGMの音楽ファイル名(拡張子不要)");

以下のようにBGM,SEが再生されます
利用させていただいている素材元は こちら を参照してください

現場からは以上です。