こちらの続きで実装編になります。
これもそうですが、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」でイベントをインスペクターでセットできる形式にしてます。
そうするとこの通りに
スライダーでボリュームの調整が可能になりました。
まとめ
前回の通り
ゲームをプレイするときに再生されるサウンド音量は各々の環境で全く異なります。
そのため、ボリュームの制御を行うのはどのゲームでも必須といっていいものです。
配信を行う場合は、必ずボリュームの設定画面を実装しておき、操作できるようにしておきましょう。
あるとないとだけで全然変わってきます。
進捗に関する報告
ここから先、敵の挙動など最終調整に入るため、毎日の開発の進捗を上げずらくなると思います(バグも多いので)ので雑談が若干多くなると思いますので
なにとぞご容赦を…
コメントを残す