様々な箇所に登場するオーディオボリュームのコントロール方法(実装編)

こちらの続きで実装編になります。

これもそうですが、BGMがすでになっているならともかく

ボリュームを変更したときにサンプルのサウンドが流れたらなおよいので今回はそれもまとめて実装していきたいと思います。

実装方法

実装は比較的簡単で

まずはAudioSourceがついているコンポーネントに「ボリューム変更者(VolumeChanger)」をセットします。

ここが一番重いですが…

音量設定画面を実装します。

今回はこのように各項目をスライダーで実装します。

またスライダーという若干曖昧な設定のためリセットボタンを追加してます。

設定画面のスクリプトは以下の通り

public class Config : MonoBehaviour
{
	// ----------------------------------------------
	// 設定項目

	// BGM
	[SerializeField]
	private Slider m_bgm = null;

	// SE
	[SerializeField]
	private Slider m_se = null;

	// SE変更時のイベント
	[SerializeField]
	private UnityEvent m_seEvent = null;

	// SE変更発火時最大カウンター
	[SerializeField]
	private float m_seFireMaxCnt = 0.1f;

	// ----------------------------------------------
	// 内部メンバ変数

	private float m_cnt = 0.0f;

	void Start()
	{
		m_bgm.maxValue = 100;
		m_bgm.minValue = 0;
		m_bgm.value = VolumeManager.Instance.GetVolume(VolumeManager.VolumeType.Bgm) * 100;
		m_bgm.onValueChanged.AddListener(
			(val) =>
			{
				VolumeManager.Instance.SetVolume(VolumeManager.VolumeType.Bgm, (int)val);
			}
		);

		m_se.maxValue = 100;
		m_se.minValue = 0;
		m_se.value = VolumeManager.Instance.GetVolume(VolumeManager.VolumeType.Se) * 100;
		m_se.onValueChanged.AddListener(
			(val) =>
			{
				VolumeManager.Instance.SetVolume(VolumeManager.VolumeType.Se, (int)val);
				if(m_cnt >= m_seFireMaxCnt)
				{
					m_cnt = 0.0f;
					m_seEvent?.Invoke();
				}
			}
		);
	}

	void Update()
	{
		if(m_cnt < m_seFireMaxCnt)
		{
			m_cnt += Time.deltaTime;
		}
	}

	/// <summary>
	/// SEリセット
	/// </summary>
	public void ResetSe()
	{
		m_se.value = 50;
	}

	/// <summary>
	/// BGMリセット
	/// </summary>
	public void ResetBgm()
	{
		m_bgm.value = 50;
	}
}

この通りスライダーの値が変化したとき「ボリューム管理者」にその値を伝えるような制御をしています。

	m_bgm.onValueChanged.AddListener(
			(val) =>
			{
				VolumeManager.Instance.SetVolume(
					VolumeManager.VolumeType.Bgm,
 					(int)val
				);
			}
		);

またBGMの場合は常に鳴り続けているので問題はないですが、

SEの場合はこのようにこちらからSEの再生を呼んであげる必要があります。

	// SE変更時のイベント
	[SerializeField]
	private UnityEvent m_seEvent = null;

	// SE変更発火時最大カウンター
	[SerializeField]
	private float m_seFireMaxCnt = 0.1f;	
		m_se.onValueChanged.AddListener(
			(val) =>
			{
				VolumeManager.Instance.SetVolume(
					VolumeManager.VolumeType.Se,
					(int)val
				);
				if(m_cnt >= m_seFireMaxCnt)
				{
					m_cnt = 0.0f;
					m_seEvent?.Invoke();
				}	
			}
		);
	void Update()
	{
		if(m_cnt < m_seFireMaxCnt)
		{
			m_cnt += Time.deltaTime;
		}
	}

今回の場合はキャラクターが球を発射してくれる演出も入るので「m_seEvent」でイベントをインスペクターでセットできる形式にしてます。

そうするとこの通りに

スライダーでボリュームの調整が可能になりました。

まとめ

前回の通り

ゲームをプレイするときに再生されるサウンド音量は各々の環境で全く異なります。

そのため、ボリュームの制御を行うのはどのゲームでも必須といっていいものです。

配信を行う場合は、必ずボリュームの設定画面を実装しておき、操作できるようにしておきましょう。

あるとないとだけで全然変わってきます。

進捗に関する報告

ここから先、敵の挙動など最終調整に入るため、毎日の開発の進捗を上げずらくなると思います(バグも多いので)ので雑談が若干多くなると思いますので

なにとぞご容赦を…


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
vuniformity誰でもない人
トレンドの行く末を見守っている
仮名を名乗るエンジニア

ゲーム開発は仕事であり趣味である
プログラムだけでなく多種多様なスキルを数多く持つ

ゲーム開発は
ソーシャルゲームを開発運用の経験アリ
ゲーム以外にも経験アリ
Webサービス保守開発等に携わる

ゲームプレイの主な戦場は
FGO
FEH
MTGA
マビノギ
ここでは主にunityroomで公開しているゲーム作り直しの軌跡を綴っていきます