Help with <Toggle>().isON

Hello I am trying to save my toggle-state through ‘PlayerPrefs’ with a ‘public static int’.

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

public class AudioStatic : MonoBehaviour
{
    public static int sfx;
    public static int music;

    public static AudioStatic instance;

    private void Awake()
    {
        gameObject.transform.parent = null;
        DontDestroyOnLoad(transform.gameObject);

        if (instance == null)
        {
            instance = this;
        }
        else
        {
            Destroy(this.gameObject);
            return;
        }
    }
  
    void Start()
    {
        music = PlayerPrefs.GetInt("Music");
        sfx = PlayerPrefs.GetInt("SFX");

        Debug.Log("music: " + music);
    }

    public static void SetInt()
    {
        PlayerPrefs.SetInt("Music", music);
    }
}

Here I save and get my PlayerPrefs.
Aswell as store my ‘public static int’.

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

public class SettingsUIManager : MonoBehaviour
{
    [SerializeField] private GameObject musicButton;

    [SerializeField] private AudioSource musicSource;



    void Start()
    {
        AudioStatic.music = PlayerPrefs.GetInt("Music");

        if (AudioStatic.music == 1)
        {
            musicButton.GetComponent<Toggle>().isOn = false;
        }
        else if (AudioStatic.music == 0)
        {
            musicButton.GetComponent<Toggle>().isOn = true;
        }
    }

    public void ToggleMusic()
    {
        if (AudioStatic.music == 1)
        {
            musicSource.mute = !musicSource.mute;
            AudioStatic.music = 0;
            AudioStatic.SetInt();

            Debug.Log("music: " + AudioStatic.music);
        }
        else if (AudioStatic.music == 0)
        {
            musicSource.mute = !musicSource.mute;
            AudioStatic.music = 1;
            AudioStatic.SetInt();

            Debug.Log("music: " + AudioStatic.music);
        }
    }
}

Here is the logic I use, the static int is used like a bool basically. And I save the static int through PlayerPrefs so it remembers if music should be on or off between sessions.

My problem is that this line of code:

if (AudioStatic.music == 1)
        {
            musicButton.GetComponent<Toggle>().isOn = false;
        }
        else if (AudioStatic.music == 0)
        {
            musicButton.GetComponent<Toggle>().isOn = true;
        }

Sets the value of my public static int to 0 again if I restart the game with the value set to 1 for some reason, without this logic the music is saved between sessions but not the checkmark of the toggle.

If you debug Log your line 18 after Start(){, does it give you the right int?

Yes it does, i dont understand whats going on really.

When u change musicButton.GetComponent<Toggle>().isOn it runs ToggleMusic() and toggle music back to off.

1 Like

Oh, how can I avoid this? Im not sure how do make the logic in that case.

    public void ToggleMusic()
    {
        bool isOn = musicButton.GetComponent<Toggle>().isOn;
        musicSource.mute = !isOn;
        if (isOn)
            AudioStatic.music = 1;
        else
            AudioStatic.music = 0;
        //or AudioStatic.music = isOn ? 1 : 0;
      
        AudioStatic.SetInt();
    }
2 Likes