そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】特定のシーンに移ったタイミングでBGMを変更する方法

環境

Unity 2019.3.7f1

はじめに

図のように特定のシーンでだけBGMを変更する方法です。
image.png
次の知識の組み合わせで設定できます。
・シングルトン設定
・シーン遷移
・if文の複数条件


・音楽再生
 音の基本
marumaro7.hatenablog.com

・デリゲート
 参考記事
nn-hokuson.hatenablog.com

・関数
 関数の基本
marumaro7.hatenablog.com


コード

空のオブジェクトにこのコードを割り当てて使用する。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //追加!!

public class test5 : MonoBehaviour
{
   //シングルトン設定ここから
    static public test5 instance;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            Destroy(this.gameObject);
        }

    }
    //シングルトン設定ここまで




    public AudioSource A_BGM;//AudioSource型の変数A_BGMを宣言 対応するAudioSourceコンポーネントをアタッチ
    public AudioSource B_BGM;//AudioSource型の変数B_BGMを宣言 対応するAudioSourceコンポーネントをアタッチ

    private string beforeScene;//string型の変数beforeSceneを宣言 
        
    void Start()
    {
        beforeScene = "Scene1";//起動時のシーン名 を代入しておく
        A_BGM.Play();//A_BGMのAudioSourceコンポーネントに割り当てたAudioClipを再生

        //シーンが切り替わった時に呼ばれるメソッドを登録
        SceneManager.activeSceneChanged += OnActiveSceneChanged;
    }

    
    

    //シーンが切り替わった時に呼ばれるメソッド 
    void OnActiveSceneChanged(Scene prevScene, Scene nextScene)
    {      
            //シーンがどう変わったかで判定
            //Scene1からScene2へ
            if (beforeScene == "Scene1" && nextScene.name == "Scene2")
            {
              A_BGM.Stop();
              B_BGM.Play();
            }

            // Scene1からScene2へ
             if (beforeScene == "Scene2" && nextScene.name == "Scene1")
             {
              A_BGM.Play();
              B_BGM.Stop();
             }         


        //遷移後のシーン名を「1つ前のシーン名」として保持
        beforeScene = nextScene.name;
    }
}

ポイント
・シングルトンのオブジェクトにする。
・現在のシーンと遷移先のシーンが一致したタイミングで音声を切換え 

おわりに

void OnActiveSceneChanged(Scene prevScene, Scene nextScene)
のprevSceneの引数の情報はうまく扱えなかったので使用していません。