mino54545454
@mino54545454

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【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です。");
    }
}

}

0

1Answer

onValueChangedを設定している箇所が提示されたソース内に見当たらないので勘ですが、、
onValueChangedを設定するソースがアタッチされたオブジェクトはDontDestroyではなく、BGMManagerのみがDontDestroyになっている弊害とかではないかなと思いました。
詳細な状況を教えていただければ、、、。

0Like

Comments

  1. @mino54545454

    Questioner

    回答ありがとうございました。
    スライダー側で習得させる方向で何とかなりました。

    using UnityEngine;
    using UnityEngine.UI;

    public class BGMSlider : MonoBehaviour
    {
    private Slider bgmSlider;

    private void Awake()
    {
    // Sliderコンポーネント取得
    bgmSlider = GetComponent();
    }

    private void Start()
    {
    // BGMの現在のボリューム設定
    bgmSlider.value = BGMManager.Instance.GetBGMVolume();
    // 呼び出し
    bgmSlider.onValueChanged.AddListener(volume => BGMManager.Instance.SetBGMVolume(volume));
    Debug.Log("BGMSlider Start called. BGMManager.Instance is " + (BGMManager.Instance == null ? "null" : "not null"));
    }

    private void OnEnable()
    {
    //再割り当て
    bgmSlider.onValueChanged.AddListener(volume => BGMManager.Instance.SetBGMVolume(volume));
    }

    private void OnDisable()
    {
    //リスナーを削除
    bgmSlider.onValueChanged.RemoveListener(volume => BGMManager.Instance.SetBGMVolume(volume));
    }
    }

Your answer might help someone💌