color×2

自分なりに学んだ事を記すところ

SEとBGMの音量ONOFFボタンを作る

TASK DESTRUCTIONをスマホゲームっぽくするため、SEとBGMの音量をプレイヤーが操作出来るようにしようと思います。

音声のONOFFの流れ

見た目はすでに作っています。

タイトルで設定画面(panel)を開いた状態です。

BGMとSEの横のスピーカーマークを押して、音量をONにするかOFFにするか切り替えたいと思います。

OFFの時はスピーカーマークに斜線を追加します。

 

実際に出来るようにする

下準備

Unityでのオプション画面作成メモ - ロードバイク時々ものづくり

こちらのサイトでAudio Sourceをグループに振り分けることが出来ると判明。

具体的なやり方はこちらを参考にしました。

Unityのオーディオミキサーを使って音声の変換や音量を変更する | Unityを使った3Dゲームの作り方(かめくめ)

まずはAseetsフォルダ内でAudioMixerを作っておきます。

名前はAudioMixersにしました。

そしてグループを作成するため、window→Audio→AudioMixerを開きます。

開くとこんな画面が出ます。(もし埋まっていたらAudioMixerと書いている上のタブをドラッグして、また埋まらないように気を付けながら外に出すとやりやすいです)

グループを作成する時はGroupsの横にある+マークを押します。Masterを選択してからBGM,SEグループを作ります。

あと、忘れてはいけないことがあります。

AseetsからAudioMixers→BGMとSE、のインスペクタの上で右クリックをして、画像の通り選択してください。

これをしておかないとスクリプトで値を変更できないので、困ります。

それからAudioMixerウィンドウに戻ってきて、右上にあるExposed Parametersを押します。

変数名として名前をつけておきます。ここでは、"BGM"と"SE"にしました。

あとはAudioSourceにグループを追加するだけです。

全てのAudioSourceのOutputにBGMかSEグループを入れて下準備完了です。

 

実際にONOFF出来るようにする(コード)

先にコードを載せておきます。

//音声に関するところだけ記載
public class GameScript_Title: MonoBehaviour
{
    [SerializeField] GameObject settingspanel; //設定画面用のパネル(音には関係ない)
    public UnityEngine.Audio.AudioMixer mixer;

    private bool BGMon; //BGMがONか?
    private bool SEon;  //SEがONか?

    float bgmvolume; //保存されたBGM音量
    float sevolume;  //保存されたSE音量

    void Start()
    {
        settingspanel.SetActive(false);

        //音声設定のロード、反映(BGM,SEのONOFFはアプリ終了しても記憶する)
        bgmvolume = PlayerPrefs.GetFloat("BGMvolume", 0); //BGM音量をロードする
        sevolume = PlayerPrefs.GetFloat("SEvolume", 0);   //SE音量をロードする
        mixer.SetFloat("BGM", bgmvolume); //BGMの音量反映
        mixer.SetFloat("SE", sevolume);   //SEの音量反映

        //0なら音声ON, そうでなければOFF
        if (bgmvolume == 0)
        {
            BGMon = true;
        }
        else
        {
            BGMon = false;
        }
        if (sevolume == 0)
        {
            SEon = true;
        }
        else
        {
            SEon = false;
        }
    }

    //BACKボタンを押せば戻る,音量保存
    public void settingspanelCancel()
    {
        PlayerPrefs.SetFloat("BGMvolume", bgmvolume); //BGM音量をセーブする
        PlayerPrefs.SetFloat("SEvolume", sevolume);   //SE音量をセーブする

        settingspanel.SetActive(false);
    }

    //スピーカーボタンを押せばBGMのON / OFF切り替え
    public void BGMsoundSwitch()
    {
        BGMon = !BGMon; //truefalseを逆にする

        //BGMをONにしたら音を鳴らす設定に
        if (BGMon)
        {
            bgmvolume = 0; //ON
            mixer.SetFloat("BGM", bgmvolume); //BGMの音量変更
        }
        else
        {
            bgmvolume = -80; //OFF
            mixer.SetFloat("BGM", bgmvolume); //BGMの音量変更
        }
    }
    //SEsoundボタンを押せばSEのON / OFF切り替え
    public void SEsoundSwitch()
    {
        SEon = !SEon; //truefalseを逆にする

        //SEをONにしたら音を鳴らす設定に
        if (SEon)
        {
            sevolume = 0; //ON
            mixer.SetFloat("SE", sevolume);  //SEの音量変更
        }
        else
        {
            sevolume = -80; //OFF
            mixer.SetFloat("SE", sevolume);  //SEの音量変更
        }
    }
}

 

実際にONOFF出来るようにする(解説)

流れとしては、

  • ゲーム起動時に音量の設定をロードし、反映する(start関数)
  • 歯車を押すとオプション画面起動。ここで音量ONOFFできる(ここは記載なし)
  • ミュートされてたらスピーカーボタンに斜線いれる(ここは記載なし)
  • スピーカーボタンクリックでmixer.SetFloatいちいち変更(BGMsoundSwitch関数,SEsoundSwitch関数)
  • オプション画面閉じる時にplayerprefs(BGMvolume,SEvolume)に音量設定セーブ(settingspanelCancel関数)

mixer.SetFloatPlayerPrefs.SetFloatとかを間違えなければ上手くいくはずです。

あと、ONOFFする時に出てきた0とか-80は音量のMax(0)とMin(-80)です。

こちらのサイトを見て参考にしました。

Unity5で脱オレオレAudioManager - Qiita

 

これでプレイヤーが自由に音量設定が出来るようになりました!