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

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

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

#####動作環境
- OS : Windows10
- Unity : 2018.2.0
- AndroidStudio : 3.1.3

####Assets配下の以下のディレクトリに音楽関連ファイルを配置
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/166357/2a5465ee-273c-a77e-d84a-4a5031b19722.jpeg)

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


```c#: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が再生されます
利用させていただいている素材元は [こちら](https://cityguardians.hatenablog.jp/entry/2018/09/02/205416) を参照してください

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今こんな感じです <a href="https://t.co/zlhEuk5lzh">pic.twitter.com/zlhEuk5lzh</a></p>&mdash; CityGuardians (@City_Guardians) <a href="https://twitter.com/City_Guardians/status/1036242626507243521?ref_src=twsrc%5Etfw">2018年9月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


現場からは以上です。