@myenro_vtuber

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Unity】全シーンでの音量+スライダー制御について

全シーンでの音量+スライダー制御について

現在作成中のゲームで

・設定アイコンクリックで設定画面のポップアップ表示
・設定ポップアップ内でBGM&SEの各スライダーで音量調節、保存
・ポップアップを開きなおしてもスライダーの位置は設定したもののまま反映
・各シーンに置いているAudioとスライダーの挙動をまとめて管理

というシステムを実装したいのですが、初心者なので記事などを参考にしても

・ポップアップ表示、クローズ
・スライダーでBGMとSEをそれぞれ管理、音量のリアルタイムプレビュー
・保存した音量を全シーンで反映

ここまで実装で限界でした。
音量変更はできても、ポップアップを開きなおすと例え音量変更した直後でもスライダーの位置が戻ってしまうなど上手くいきません。

ポップアップの表示と閉じる処理は購入したアセットの入退場アニメーションとスクリプトを採用しているので、こんなコードの中身になっています。
音量の管理はAudioMixerでやっています。
どうしたら各シーン違うBGMやSEを入れてもBGMとSEのグループごとに全シーンで変更内容が保存され、かつシーン移動やポップアップの再表示を挟んでも変更した音量でスライダーの位置が反映されるようになるでしょうか。
どうかご助言いただきたいです。


Audio.csをタイトルシーンのEventSystemのみにアタッチ
SettingPopup.csを各シーンの設定パネルにアタッチ
AudioMixerにてBGMとSEのグループを作成し各Audioのoutputにアタッチ

Audio.cs

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

public class Audio : MonoBehaviour
{
    public static Audio Instance { get; private set; }

    [SerializeField] private AudioMixer audioMixer;
    [SerializeField] private Slider BGMSlider;
    [SerializeField] private Slider SESlider;

    private const string BGMKey = "BGMVolume";
    private const string SEKey = "SEVolume";

    private void Awake()
    {
        if (Instance != null && Instance != this)
        {
            Destroy(gameObject);
            return;
        }
        Instance = this;
        DontDestroyOnLoad(gameObject);

        float bgmVolume = PlayerPrefs.GetFloat(BGMKey, 0.75f);
        float seVolume = PlayerPrefs.GetFloat(SEKey, 0.75f);

        SetBGM(bgmVolume);
        SetSE(seVolume);

        if (BGMSlider != null)
        {
            BGMSlider.value = bgmVolume;
            BGMSlider.onValueChanged.AddListener((v) =>
            {
                SetBGM(v);
                PlayerPrefs.SetFloat(BGMKey, v);
                PlayerPrefs.Save();
            });
        }

        if (SESlider != null)
        {
            SESlider.value = seVolume;
            SESlider.onValueChanged.AddListener((v) =>
            {
                SetSE(v);
                PlayerPrefs.SetFloat(SEKey, v);
                PlayerPrefs.Save();
            });
        }
    }

    public void SetBGM(float volume)
    {
        audioMixer.SetFloat("BGM", volume);
    }

    public void SetSE(float volume)
    {
        audioMixer.SetFloat("SE", volume);
    }

    public float GetBGM() => PlayerPrefs.GetFloat(BGMKey, 0.75f);
    public float GetSE() => PlayerPrefs.GetFloat(SEKey, 0.75f);
}

Settingpopup.cs

using UnityEngine;
using UnityEngine.UI;

public class SettingPopup : MonoBehaviour
{
    [SerializeField] private Slider BGMSlider;
    [SerializeField] private Slider SESlider;

    private void OnEnable()
    {
        if (Audio.Instance == null) return;

        if (BGMSlider != null)
            BGMSlider.value = Audio.Instance.GetBGM();
        if (SESlider != null)
            SESlider.value = Audio.Instance.GetSE();

        if (BGMSlider != null)
            BGMSlider.onValueChanged.AddListener((v) =>
            {
                Audio.Instance.SetBGM(v);
            });

        if (SESlider != null)
            SESlider.onValueChanged.AddListener((v) =>
            {
                Audio.Instance.SetSE(v);
            });
    }

    private void OnDisable()
    {
        if (BGMSlider != null)
            BGMSlider.onValueChanged.RemoveAllListeners();
        if (SESlider != null)
            SESlider.onValueChanged.RemoveAllListeners();
    }
}
0 likes

1Answer

Your answer might help someone💌