ゲームジャム向け 音量をスライドバーで調整する方法

Unity解説

みんな音量設定バーがあってうらやましいなあ

ゲームジャムをやっていたら必須のやつよね、

音量設定バーの作り方を説明するよ

※本記事はスタジオしまづさんの動画をもとにしています。ぜひ併せてご覧くださいませ

https://www.youtube.com/watch?v=pf7j93Tb9VI

unity1weekなどゲームジャムで必須の音量設定

音量調整がないゲームのサウンド評価は下げると言い切る実況者さんもいるくらい、音量の調整は大事なようです。なので音量設定を実装している人が非常に多いです。

イメージはこんなスライドバーですね(簡素でごめんなさい)。

スライドバーで音量を設定したい

どう音量設定バーを実装するか

音量設定バーは2つの知識の組み合わせでできています。

  • 音を出すAudioSourceの使い方
  • スライドバーの使い方

まずはAudioSourceから置いていきましょう。

AudioSource

音を出すにはAudioSourceコンポーネントが必要です。ナニモノかはさておき、適当なGameObjectにアタッチしてみてください。ここではSoundManagerという名前にしました。

SoundManagerというGameObjectにAudioSourceをアタッチ

そしてAudioClipのところに好きな音を放り込みます。上記例だとReputation.mp3を入れてます。
あと、Play On AwakeをONにしておいてください。これでシーンを再生すると自動的にBGMがなります。

スライドバー

次に、ボリュームを設定するためのスライドバーを作っていきます。

こんな処理フローのイメージです。

イメージ

ではまずスライダーを置きましょう。UI→Sliderです。

SliderにBGMSliderと名前を付けました

※STARTボタンは今の本題ではないです、後で使います

画面にBGMのSliderが出ています

実行してみると、スライダーをマウスで動かすことができると思います。

この、「プレイヤーがスライダーの値を変更したとき」にUnityのOnValueChangedというイベントが発生します。スライダーのインスペクタにあるOn Value Changed の欄ですね。

SliderについているOn Value Changedイベント

ここではスライダーの値をキャッチしてSoundManager にボリュームを変更するよう指示したいので、Sliderにイベントハンドラのスクリプトを作っていきます。

※この時点ではSoundManagerができていないのでエラーになりますのでコメントアウトしておいてください

VolumeSlider.cs

using UnityEngine;

public class VolumeSlider : MonoBehaviour
{
    public void SetBGMVolume(float volume)
    {
      //SoundManager.instance.SetBGMVolume(volume);
    }
}

これをスライダーにアタッチして、イベントハンドラに作ったメソッドを設定します。

SliderのOnValueChangedに関数を設定

このとき、選択肢の上の方にあるDynamic floatのSetBGMVolumeを選んでください。

Static Parametersのほうは固定値になってしまいます。

こっちはニセモノ

SoundManagerに音量設定の関数を作る

さきほど作ったスライダーから呼ばれる音量設定の関数SetBGMVolumeを作ります。
インスペクタで設定したAudioSourceのボリューム値を直接指定するようにしてあります。

SoundManager.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class SoundManager : MonoBehaviour
{

    public static SoundManager instance;

    [SerializeField] AudioSource bgmAudioSource;

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

    public void SetBGMVolume(float volume)
    {
        bgmAudioSource.volume = volume;
    }
}

ここで、なにやら見慣れないstatic のブツがありますが、これはスライダーのスクリプトからSoundManagerにアクセスしやすくするための工夫です。”シングルトン”とか「どこでも見れるやーつ」とよばれます。

また、DontDestroyOnLoadはタイトルで設定した音量が次のシーンでも引き継がれるようにする仕組みです。次のシーンにSoundManagerがなくてもSoundManagerがタイトルシーンから引き継がれます。

※この段階でVolumeSlider.csのコメントアウトを外しておいてください

ここまで設定すると、スライダーで音量調整ができるようになっていると思います。

シーン移動後も確認しておく

ここまでできれば完成なのですが、タイトル画面で音量調節したらゲーム内で反映されていることを確認しておきましょう。

テキトウなシーンを用意します。何も配置しなくてもいいです。

テキトウなシーン

あと、File →Build Settingsで両方のシーンを追加しておきます。

ビルド設定にシーンを含めるのをお忘れなく

シーンを移動するスクリプトをタイトル画面のボタンに取り付けます。

StartButton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class StartButton : MonoBehaviour
{
    public void OnClick()
    {
        SceneManager.LoadScene("Stage1");
    }
}

では、タイトルシーンを再生してみましょう。

シーン移動後もBGMが設定した音量になっていると思います。

なお、DontDestroyOnLoadに指定したSoundManagerがヒエラルキーにあるので確認してみてください。これが前画面から引き継がれたSoundManagerです。

効果音の音量設定の注意

効果音の音量設定バーは少し注意が必要なケースがあります。

BGMと違って効果音は複数あるかと思います。
もし効果音を出すのに1つのAudioSourceを使いま合わして複数のAudioClipを切り替える方法を採っているのであれば、そのAudioSourceのボリュームを変えればよいです。
こんなイメージです。

SoundManager.cs

[SerializeField] AudioSource seAudioSource;
// ボリューム変更
public void SetSeVolume(float volume)
{
    seAudioSource.volume = volume;
}
// クリップを受け取ってSEを鳴らす
public void PlaySE(AudioClip clip)
{
    seAudioSource.PlayOneShot(clip);
}

一方、AudioClipごとにAudioSourceを1つあてがっている場合はそれらすべてのAudioSourceのボリュームを変更することを忘れないでください。あんまり複数ソースはやらないと思いますけど・・・

SoundManager.cs

public class SoundManager : MonoBehaviour
{
    // インスペクタでクリップ設定済みのソース
    [SerializeField] AudioSource[] seAudioSource;

    //音量変更
    public void SetSEVolume(float volume)
    {
        foreach (AudioSource audioSource in seAudioSource)
        {
            audioSource.volume = volume;
        }
    }

    //攻撃音を鳴らす
    public void PlayAttackSE()
    {
        seAudioSource[0].Play();
    }
    //ボム音を鳴らす
    public void PlayBombSE()
    {
        seAudioSource[1].Play();
    }
}

以上です!!

なお、有料アセットFEELの機能の1つを使って簡単に設定する方法もあります。
音量以外にも総合的なエフェクトが簡単にできる非常に強力なツールなので導入を考えている方はこちらもご覧ください。

ゲームジャム向け FEELアセットで簡単に音量設定する方法

かわいい我が子にオリジナルアプリを!

コメント

タイトルとURLをコピーしました