@bloodrosesoll2 (kroro)

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!

音量を変えたとしてもシーンをまたいで使えるようにしたい。

解決したいこと

前のシーンで音量をいじった後にシーンをまたいだとしても設定した音量を継続させたい。

プログラミング初心者なのですが、オーディオスライダーを自分なりにネットで調べて作ったのですが、前のシーンで設定した音量を次のシーンに受け継ぐ方法がよくわからないので、知っている方がいましたらご教授していただけると助かります。

複雑なプログラムで2つのプログラムを合わせて使っているのですが、どこかにちょい足しでスプリクト書き込めばいけそうな気がするのですが、どこをどうしたらいいかよくわからないのでコードを載せてみますので、分かる方おりましたらよろしくお願いします。

該当するソースコード

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

public class AudioManager : MonoBehaviour
{
[SerializeField] AudioClip[] seList;
[SerializeField] AudioClip[] bgmList;
[SerializeField] AudioClip[] voiceList;

[SerializeField] AudioSource audioSourceBGM;
[SerializeField] AudioSource audioSourceSE;
[SerializeField] AudioSource audioSourceVoice;

public float BGMVolume
{  
    get { return audioSourceBGM.volume; }
    set { audioSourceBGM.volume = value; }
}
public float SEVolume
{
    get { return audioSourceSE.volume; }
    set { audioSourceSE.volume = value; }

}
public float VoiceVolume
{
    get { return audioSourceVoice.volume; }
    set { audioSourceVoice.volume = value; }

}
static AudioManager Instance = null;

public static AudioManager GetInstance()
{
    if (Instance == null)
    {
        Instance = FindObjectOfType<AudioManager>();
    }
    return Instance;


}
private void Awake()
{
    if (this != GetInstance())
    {
        Destroy(this.gameObject);
        return;
    }
    DontDestroyOnLoad(this.gameObject);
}

public void PlaySound(int index)
{
    audioSourceSE.PlayOneShot(seList[index]);


}
public void PlayBGM(int index)
{
    audioSourceBGM.clip = bgmList[index];
    audioSourceBGM.Play();

}
public void PlaySound2(int index)
{
    audioSourceVoice.clip = voiceList[index];
    audioSourceVoice.Play();

}

}

上のスクリプトと下のスクリプトを使ってスライダーを使って音量(BGM、SE、voice)を操作しております。

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

public class presenter : MonoBehaviour
{
    public bool DontDestroyEnabled = true;

    [SerializeField] Slider bgmSlider;
    [SerializeField] Text bgmVolumeText;

    [SerializeField] Slider seSlider;
    [SerializeField] Text seVolumeText;

    [SerializeField] Slider voiceSlider;
    [SerializeField] Text voiceVolumeText;


    // Start is called before the first frame update
    void Start()
    {
        //AudioManager.GetInstance().PlayBGM(0);

        OnChangedBGMSlider();
        OnChangedSESlider();
        OnChangedVoiceSlider();
        if (DontDestroyEnabled)
        {
            // Sceneを遷移してもオブジェクトが消えないようにする
            DontDestroyOnLoad(this);
        }
        }

    public void OnChangedBGMSlider()
    {
        AudioManager.GetInstance().BGMVolume = bgmSlider.value;
       bgmVolumeText.text = string.Format("{0:0.00}", bgmSlider.value);
    }
    public void OnChangedSESlider()
    {
        AudioManager.GetInstance().SEVolume = seSlider.value;
        seVolumeText.text = string.Format("{0:0.00}", seSlider.value);
    }
    public void OnChangedVoiceSlider()
    {
        AudioManager.GetInstance().VoiceVolume = voiceSlider.value;
        voiceVolumeText.text = string.Format("{0:0.00}", voiceSlider.value);
    }
    public void OnSETestButton()
    {
        AudioManager.GetInstance().PlaySound(7);
    }
    public void OnVoiceTestButton()
    {
        AudioManager.GetInstance().PlaySound2(0);
    }

    
}

自分で試したこと

privateとstaticなどいろんなところにつけてみましたがうまくいきませんでした。
分かる方いましたらよろしくお願いします。

0 likes

1Answer

AudioManagerがアタッチされているオブジェクトが破棄されないようになっているため、シーンをまたいでも各AudioSourceのボリュームは維持され続ける(受け継がれている)ように見えます。

少し気になったのは、presenterはDontDestroyEnabledフラグによって、破棄されないようにも破棄されるようにもできるようになっているようですが、どちらに設定されていますでしょうか?
前者の場合はAudioManagerと同様に設定が維持され続けると思いますが、
後者の場合は、presenterのあるシーンに遷移したさいなどに、スライダーの初期位置(おそらく0)にボリュームが上書きされ、引き継がれていないように見えるのかな?と思いました。
その場合は、以下のようにスライダーを現在のボリュームの位置に設定するなどの処理が必要かもしれません。

presenter.cs
...
    void Start()
    {
        var audio = AudioManager.GetInstance();
        bgmSlider.value = audio.BGMVolume;
        seSlider.value = audio.SEVolume;
        voiceSlider.value = audio.VoiceVolume;

        OnChangedBGMSlider();
        OnChangedSESlider();
        OnChangedVoiceSlider();
...

1Like

Comments

  1. @bloodrosesoll2

    Questioner

    助言ありがとうございます!現在ゲーム開発のアニメーション制作部分を終わらせてますので、後日こちらのスクリプトを試してみようと思います!
    勉強になります!

Your answer might help someone💌