Unity勉強中!あこがれだったプログラマーに今からなろう!

昔あこがれだったプログラマー。今からでもUnityを勉強してみようと思い立ち、チャレンジ開始! Unity勉強メモや、悪戦苦闘な日々の記録です。

Audio Mixerとスライダーの連携:3Dアクションゲームを作ろう(16)

前回まででタイトル画面がひと段落したので、今度は設定画面の作成をしよう。
設定といってもこのゲーム、調整があるのは音量調整くらい。
あとは、PCでプレイするときには、スマホ用に用意するバーチャルコントローラーは邪魔になるから
これは消せる様にしておきたい。

で、パパッと配置を決める。


・・・とはいかなくて、実際にはこの画面の配置を作るだけで、ほぼ2日かかりました🤣
ボリューム調整用のボタンがどうにも気に入らなくて、色々と変えているうちに、時間だけがどんどん過ぎていったわけで🤪

まぁ、何はともあれ画面はできたので、あとはこれを実際に機能するように作り込んでいく。

まずはボリューム調整機能。
以前にシューティングゲームを作った時に学んだ事だし😆
コピペでどうにかなるでしょ。

amaniku.hatenablog.com

・・・と思ったんだけど、なぜかボリューム調整ができない😅
備忘録のために、前回のスクリプトを記事に残したというのに😅
初期の頃の記事のせいか、肝心なことは何にも記録してない😭
参考にした記事の記録もない😭

ぼやいてても仕方ないので、今の状況の確認をする事にしよう。

スライダーは動く。スライダーの値もfloat型の変数に取得できている。
スライダーの値が変わった時に発動するコールバックSlider.onValueChanged.AddListenerも動いている。

でも、肝心のAudio Mixerの値が取得できてないし、スライダーの値をAudio Mixerに反映できていない。

気づいたら、ちょうど時間が21:00だったので、
困ったときの、スタジオしまづさんのオンラインサロン〜🙇
21:00から毎日開催されているユニコンで、ジョニさんに教えを乞い、なんとか解決できました😆

数ヶ月前に作ったばかりなのに、やっぱり、すっかり記憶から抜けるもんだね💦

という事で、今回の備忘録は、ちゃんと各Objectのインスペクターもしっかり残しておこう。
参考にした記事は、これ。

note.com

今回うまくいかなかったのは、この「Exposed Parameters」とやらを作成し忘れていたから💦

スライダーの設定については、今回参考にした記事と、シューティングゲームの時のスクリプトでは、
スライダー操作の仕方や、音量を段階的な設定にするかなど、コンセプトが違う。

シューティングゲームの時のスクリプトでの場合は、スライダーのインスペクターはこうなっている。

Interactableのチェックを外すことで、手動操作ではスライダーの変更をできなくする。

総数にチェックを入れることで、スライダーのValueを整数値に制限し、
Min ValueとMax Valueは、Audio Mixerのボリューム値の-80〜0の範囲を1/10にした値で設定する。
これでボリュームの調整は9段階に制限できる。

スクリプトは、シューティングゲームの時のスクリプト(といっても、これもどこかのサイトのほぼ丸コピーだったはず😅)
から、ちょこっと変更。
Audio Clipは専用 のScriptable Objectsを作成して、参照する様に変更した。

using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.UI;

public class SettingMenu : MonoBehaviour
{
    [SerializeField] AudioMixer audioMixer;
    [SerializeField] Slider BGMSlider;
    [SerializeField] Slider SESlider;
    [SerializeField] AudioSource BGMaudio;
    [SerializeField] AudioSource SEaudio;

    void Start()
    {
        //AudioMixerのBGMボリュームをBGMスライダーに取り込み。
        audioMixer.GetFloat("BGM", out float bgmVolume);
        BGMSlider.value = Mathf.Round(bgmVolume/10); //9段階になるように四捨五入

        //AudioMixerのSEボリュームをSEスライダーに取り込み。
        audioMixer.GetFloat("SE", out float seVolume);
        SESlider.value = Mathf.Round(seVolume / 10); //9段階になるように四捨五入

        //スライダーの値が変化した時の処理を登録
        BGMSlider.onValueChanged.AddListener(SetAudioMixerBGM);
        SESlider.onValueChanged.AddListener(SetAudioMixerSE);
    }

    public void SetAudioMixerBGM(float value)
    {
        BGMaudio.Stop();

        var volume = value*10;//スライダーの値を10倍にして
        audioMixer.SetFloat("BGM", volume);//AudioMixerのBGMのボリュームに設定

        BGMaudio.Play();
    }

    public void SetAudioMixerSE(float value)
    {
        var volume = value * 10;//スライダーの値を10倍にして
        audioMixer.SetFloat("SE", volume);//AudioMixerのSEのボリュームに設定
        SEaudio.PlayOneShot(AudioSO.Entity.TestSE);//テストのため、効果音を鳴らす。
    }
}

これでAudio Mixerとスライダーの連携はできたので、
次回でスライダーの値を変更するための、ボタンの処理を作っていこう。