Audio slider for multiple scenes.

Hello, I’m working on my first game project. I’ve made the main menu and I’ve added a slider for the volume. My problem is that the volume slider onlys work for main menu scene and I want to work with every scene but I don’t know how to do that. Here’s the code so far

public class VolumeValueChanger : MonoBehaviour
{
    
    private AudioSource audioSrc;
    

    [SerializeField] Slider volumeSlider;
    
    private float musicVolume = 1f;

    
    void Start()
    {

        
        audioSrc = GetComponent<AudioSource>();
        
    }
    
    void Awake()
    {
        if (PlayerPrefs.HasKey("Volume"))
        {
            SetVolume(PlayerPrefs.GetFloat("Volume"));
            volumeSlider.value = PlayerPrefs.GetFloat("Volume");
        }
    } 

    
    void Update()
    {

        audioSrc.volume = musicVolume;
        
    }

    
    public void SetVolume(float vol)
    {
        musicVolume = vol;
        PlayerPrefs.SetFloat("Volume", vol);
        
    }
}

First of all, get rid of your script.

PlayerPrefsFloatLoader.cs

To be attached to any gameObject, preferably to your AudioSource

Add AudioSource > volume (dynamic) to the onValueLoaded event

Add Slider > value (dynamic) to the onValueLoaded event only in the main scene

Set the key to Volume

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class FloatEvent : UnityEvent<float> { }

public class PlayerPrefsFloatLoader : MonoBehaviour
{
    [SerializeField] private string key;
    [SerializeField] private float defaultValue = 0;
    [SerializeField] private FloatEvent onValueLoaded;

    private void Awake()
    {
        onValueLoaded.Invoke(PlayerPrefs.GetFloat(key, defaultValue));
    }
}

PlayerPrefsFloatSaver.cs

To be attached to any gameObject, preferably to your Slider

Add PlayerPrefsSaver > SetFloat (dynamic) to the onValueChanged event of the Slider in the main scene

Add AudioSource > volume (dynamic) to the onValueChanged event of the Slider in the main scene

Set the key to Volume

using UnityEngine;

public class PlayerPrefsFloatSaver : MonoBehaviour
{
    [SerializeField] private string key;
    
    public void SetFloat(float value)
    {
        PlayerPrefs.SetFloat(key, value);
    }
}

Right click on image > Open in new tab if it’s too small for you to read

Since you are writing it in a PlayerPref, and I am assuming that you have another VolumeValueChanger in your other scene as well.
Based on the above assumption you can Implement the SceneLoaded Event from Unity SceneManager and re-load the value from PlayerPrefs.

P.S. Two quick Solutions:

  1. Make your object Don’t Destroy On
    Load >> In order for it to Persist
    between scenes and retain its
    values.
  2. Make a sound manager class,
    and make it Singleton that also
    doesn’t destroy on load

More info in Don’t Destroy On Load here: