みんな音量設定バーがあってうらやましいなあ
ゲームジャムをやっていたら必須のやつよね、
音量設定バーの作り方を説明するよ
※本記事はスタジオしまづさんの動画をもとにしています。ぜひ併せてご覧くださいませ
https://www.youtube.com/watch?v=pf7j93Tb9VI
unity1weekなどゲームジャムで必須の音量設定
音量調整がないゲームのサウンド評価は下げると言い切る実況者さんもいるくらい、音量の調整は大事なようです。なので音量設定を実装している人が非常に多いです。
イメージはこんなスライドバーですね(簡素でごめんなさい)。
どう音量設定バーを実装するか
音量設定バーは2つの知識の組み合わせでできています。
- 音を出すAudioSourceの使い方
- スライドバーの使い方
まずはAudioSourceから置いていきましょう。
AudioSource
音を出すにはAudioSourceコンポーネントが必要です。ナニモノかはさておき、適当なGameObjectにアタッチしてみてください。ここではSoundManagerという名前にしました。
そしてAudioClipのところに好きな音を放り込みます。上記例だとReputation.mp3を入れてます。
あと、Play On AwakeをONにしておいてください。これでシーンを再生すると自動的にBGMがなります。
スライドバー
次に、ボリュームを設定するためのスライドバーを作っていきます。
こんな処理フローのイメージです。
ではまずスライダーを置きましょう。UI→Sliderです。
※STARTボタンは今の本題ではないです、後で使います
実行してみると、スライダーをマウスで動かすことができると思います。
この、「プレイヤーがスライダーの値を変更したとき」にUnityのOnValueChangedというイベントが発生します。スライダーのインスペクタにあるOn Value Changed の欄ですね。
ここではスライダーの値をキャッチしてSoundManager にボリュームを変更するよう指示したいので、Sliderにイベントハンドラのスクリプトを作っていきます。
※この時点ではSoundManagerができていないのでエラーになりますのでコメントアウトしておいてください
VolumeSlider.cs
using UnityEngine;
public class VolumeSlider : MonoBehaviour
{
public void SetBGMVolume(float volume)
{
//SoundManager.instance.SetBGMVolume(volume);
}
}
これをスライダーにアタッチして、イベントハンドラに作ったメソッドを設定します。
このとき、選択肢の上の方にある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アセットで簡単に音量設定する方法
かわいい我が子にオリジナルアプリを!
コメント
[…] ゲームジャム向け 音量をスライドバーで調整する方法 […]