【Unity】BGM・SEの鳴らし方と切り替え方

## まえがき
BGM・SEの鳴らし方について説明していきます。

ゲームには音楽がないと寂しいので。

## 音声データの用意
フリー素材を配布しているサイトなどで音声ファイルをダウンロードして下さい。
いくつかサイトを掲載しておきます。

もちろん、音声ファイルを用意できるなら別の方法でもいいです。

[魔王魂](https://maou.audio/)
[効果音ラボ](https://soundeffect-lab.info/)
[Dova](https://dova-s.jp/)
[OtoLogic](https://otologic.jp/)
[Springin](https://www.springin.org/sound-stock/)

## Unityに実装
インストールした音声ファイルを鳴らせるようにしていきます。

### フォルダの追加
ProjectのAssetsフォルダに**Audio**という名前のフォルダを作成して下さい。
その後、中に先ほど用意した音声データを入れます。今回は、BGMとSEの2種類を再生してみます。

![スクリーンショット 2024-08-12 133950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/9345d263-772c-b774-4670-f5b53237af47.png)

### BGMの再生
**BGM**という名前のAudio Sourceを作成して下さい。

![スクリーンショット 2024-08-12 134202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/dc1462ca-6b09-ca78-75be-bd4ecc965128.png)

InspectorからAudioClipに先ほどAudioフォルダに追加した音声データを入れて下さい。

Play On Awakeにチェックが入っていることを確認して下さい。また、Loopにチェックを入れると文字通りBGMがループ再生されるようになります。

![スクリーンショット 2024-08-12 134710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/1ce5f99f-74c1-b4d8-a6dd-fdc4015cb116.png)

これでBGMの実装は終了です。

実際にPlayしてBGMが再生されるか確認して下さい。もしBGMが聞こえない場合はToggle Audioがoffになっていないか確認してみて下さい。

![スクリーンショット 2024-08-12 134432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/3bf689ed-d0b1-c47d-6554-1c212d330ae2.png)

#### BGMの切り替え
ゲームオーバー時などにBGMを切り替える方法について説明していきます。

まず、切り替えるBGMについて、先ほどと同様にしてBGMの実装を行って下さい。今回は**GameOverBGM**とします。
この際、Play On Awakeのチェックは外しておいて下さい。そうすることで最初はGameOverBGMを鳴らさない事ができます。

続いて、**GameManager**のScriptに変更を加えていきます。もし無ければ作成して下さい。

以下、追加したプログラムの説明です。

まず、bgmとgameoverbgmというGameObjectとAudioSourceの変数を用意します。その後、Start関数でGameObjectとComponentをそれぞれ取得します。

:::note warn
GameOverBGMの部分は、作成したAudioSourceの名前と一致させて下さい。
:::

続いて、BGMを切り替えたいトリガー部分にBGMを切り替えるプログラムを追加します。現在流れているBGMをStopし、次に流したいBGMを再生することで実現しています。

今回はゲームオーバー時に実行されるGameOver関数の中に追加します。

<details open><summary>GameManager</summary>


```c#
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Assertions.Must;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    private GameObject bgm;
    private GameObject gameoverbgm;
    private AudioSource audioSource = null;
    // Start is called before the first frame update
    void Start()
    {
        bgm = GameObject.Find("BGM");
        gameoverbgm = GameObject.Find("GameOverBGM");
        audioSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void GameOver()
    {
        audioSource = bgm.GetComponent<AudioSource>();
        audioSource.Stop();
        audioSource = gameoverbgm.GetComponent<AudioSource>();
        audioSource.Play();
    }
}
```
</details>

これで任意のタイミングでBGMを切り替えることが出来るように鳴りました。BGMの種類を更に追加したい場合も同様です。

### SEの再生
BGMはゲーム中常に再生されるのに対して、SEは何かトリガーがあったときに再生される音声なので、Scriptで制御していきます。

**GameManager**のScriptがなければ作成し、GameManagerという空のオブジェクトを生成してアタッチして下さい。
SEを鳴らす処理をGameManagerのScriptに追加していきます。

以下、プログラムの説明です。

AudioSourceとAudioClipの変数を用意します。Start関数でAudioSourceのComponentを取得します。(AudioClipのSEについては後ほどInspectorから追加します。)

PlaySE関数を追加します。SEを鳴らしたいときにこの関数を呼び出すことでSEを再生することができます。今回はゲームオーバー時に呼び出されるGameOver関数の中でPlaySE関数を呼び出すことで、ゲームオーバーしたらSEが再生されるコードになっています。

<details open><summary>GameManager</summary>


```c#
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Assertions.Must;
using UnityEngine.SceneManagement;

public class GameManager : MonoBehaviour
{
    private AudioSource audioSource = null;
    public AudioClip SE;
    // Start is called before the first frame update
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {
    
    }

    public void PlaySE(AudioClip clip)
    {
        if (audioSource != null)
        {
            audioSource.PlayOneShot(clip);
        }
        else
        {
            Debug.Log("audiosource=null");
        }
    }

    public void GameOver()
    {
        PlaySE(SE);
    }
}
```
</details>

最後にGameManagerのInspectorからSEの部分にAudioフォルダ内の音声ファイルを入れて下さい。

![スクリーンショット 2024-08-12 142329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858134/fb5facbe-e166-fe1b-51e0-87d1958a0221.png)

以上でSEが再生されるようになりました。

確認のためにUpdate関数の中にWが押されたらGameOver関数を呼び出す処理を追加して、SEが鳴るか確認してみましょう。

<details open><summary>GameManagerのUpdate関数</summary>



```c#
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            GameOver();
        }
    }
```
</details>

実際にWを押してSEが再生されることを確認できれば実装は終了です。

## あとがき
今回はUnityでBGMとSEを再生する方法について説明しました。

音が鳴るだけでゲーム感が増しますね。