Home > Software engineering >  How to stop the execution of the code until I read a value from PlayerPref in Unity
How to stop the execution of the code until I read a value from PlayerPref in Unity

Time:11-02

Currently I am using Toggles to select a list of images and rather ran into an interesting problem.

I am using a Toggle Group called Radio Group and have 3 toggles under it. Each time when a toggle is selected the command

 PlayerPrefs.SetInt("SaveToggleId", id);

is run. In this the id number is 0 for toggle 1, 1 for toggle 2 and so on.

So when I try to read this data the next time , the following set of code always reads 0 when used in Start and the correct value when used in Awake

toggleGroupId = PlayerPrefs.GetInt("SaveToggleId");
toggleGroupObject = GetComponent<ToggleGroup>();
SelectStartingToggle(toggleGroupId);

When I used this code in conjuction with the Debug.log() statements in various places what I found is when used in Start , it first reads from the function associated when the first toggle is selected and therby stores 0 . But when I use it in Awake it reads the right value stored in PlayerPrefs and selects the correct initial value

My explanation would be that because Awake is executed before Start , it has ample time to read from PlayerPrefs which gives the correct value. Also when I used only the number in the Start() as follows

SelectStartingToggle(3);

it correctly selected the right toggle whereas when I used PlayerPref instead of number ,it chose the wrong value.

Is my explanation correct or am I missing something?Also how to make sure the code execution is halted until the data from PlayerPref is read. Here is the full code:

public class RadioButtonSystem : MonoBehaviour
{
    ToggleGroup toggleGroupObject;
    private int toggleGroupId;

    // Start is called before the first frame update
    private void Awake()
    {
        toggleGroupId = PlayerPrefs.GetInt("SaveToggleId");
        toggleGroupObject = GetComponent<ToggleGroup>();
        Debug.Log("SaveToggleId........"   toggleGroupId);
        SelectStartingToggle(toggleGroupId);

    }
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {

    }
    public void onSelectedToggle1()
    {
        SaveToggleId(0);
    }
    public void onSelectedToggle2()
    {
        SaveToggleId(1);
    }
    public void onSelectedToggle3()
    {
        SaveToggleId(2);
    }

    public void SelectStartingToggle(int id)
    {
        Toggle[] toggles = GetComponentsInChildren<Toggle>();
        toggles[id].isOn = true;
    }

    public void SaveToggleId(int id)
    {
        PlayerPrefs.SetInt("SaveToggleId", id);
        Debug.Log("SaveToggleId........saving..........."   PlayerPrefs.GetInt("SaveToggleId"));
    }

    /*  Toggle GetSelectedToggle()
      {
          Toggle[] toggles = GetComponentsInChildren<Toggle>();
          foreach (var t in toggles)
              if (t.isOn) return t;  //returns selected toggle
          return null;           // if nothing is selected return null
      }*/

}

CodePudding user response:

Playerprefs are saved upon OnApplicationQuit(). If you want to save it immediately, call PlayerPrefs.Save(). After PlayerPrefs.SetInt().

Btw, from the unity scripting api:

This function will write to disk potentially causing a small hiccup, therefore it is not recommended to call during actual gameplay.

CodePudding user response:

In the edit/project settings there is a tab called script execution order, where you can set the order in which your scripts will be executed. For example, you have a "LoadManager" script, you set its priority to 1, and you set everything that relys on it to a greater number like 10.

If you fo this, nothing eill start executing until your manager script finished.

  • Related