【UNITY】シーン遷移した際に、on value change スクリプトが取れてしまう。
解決したいこと
ここに解決したい内容を記載してください。
現在,UNITYでのBGM調整で困っています。
シーンをまたぐと、スライダーのon value change がアサイン取れてしまいます。
スライダーにはアサインしなくても音量調節ができるようにしてほしいです。
原因としては、BGMManagerがDon't Destroy On Loadを使用していることにより、シーンを切り替えたときにもオブジェクトが破棄されずに残り、その結果、重複したスライダーのon value changeがアサインされてしまっているのかなと考えました。
---BGMManager---
using UnityEngine;
using UnityEngine.UI;
public class BGMManager : MonoBehaviour
{
private AudioSource audioSourceBGM;
public AudioClip bgm;
public static BGMManager Instance;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
audioSourceBGM = gameObject.AddComponent<AudioSource>();
audioSourceBGM.loop = true;
audioSourceBGM.clip = bgm;
audioSourceBGM.Play();
}
else
{
// すでに存在する場合は即座に破棄する
Destroy(gameObject);
}
}
public void PlayBGM()
{
if (!audioSourceBGM.isPlaying)
{
audioSourceBGM.Play();
}
}
public void SetBGMVolume(float volume)
{
audioSourceBGM.volume = volume;
}
// BGMSliderから呼び出す用
public float GetBGMVolume()
{
return audioSourceBGM.volume;
}
}
--BGMSlider----
using UnityEngine;
using UnityEngine.UI;
public class BGMSlider : MonoBehaviour
{
private void Awake()
{
// BGMManager.Instanceがnullでないことを確認
if (BGMManager.Instance != null)
{
Debug.Log("BGMManager.Instanceがnullでない。");
// Sliderコンポーネントを取得
Slider slider = GetComponent<Slider>();
// Sliderコンポーネントがnullでないことを確認
if (slider != null)
{
// BGMManagerのGetBGMVolume()で取得した値をスライダーの値に設定
slider.value = BGMManager.Instance.GetBGMVolume();
}
else
{
Debug.LogError("Sliderコンポーネントがnullです。");
}
}
else
{
Debug.LogError("BGMManager.Instanceがnullです。");
}
}
// こちらをスライダーに登録
public void SetBGMVolume(float volume)
{
// BGMManager.Instanceがnullでないことを確認
if (BGMManager.Instance != null)
{
BGMManager.Instance.SetBGMVolume(volume);
Debug.Log("SetBGMVolumeが呼ばれました。設定された音量: " + volume);
}
else
{
Debug.LogError("BGMManager.Instanceがnullです。");
}
}
}