Issues with Calling From Main Thread

Hello!

I’m working on a script that handles the meat of my saves in my game. I want the user to be able to click a button in the pause menu to save the game, and have the script load a GUI Canvas saying “No Save Data Found”, or load the saved level string. When I run the function however, it gives me this error:

ArgumentException: INTERNAL_CALL_GetActiveScene can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
INTERNAL_CALL_GetActiveScene can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.

I’m not really sure what’s happening, or what I can do to fix it. If anyone can figure out a fix, that would be awesome!

Script (Sample):

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class SaveAndLoad : MonoBehaviour {

	Scene myscene = SceneManager.GetActiveScene();
	public string LoadChecker = "false";

	public void LoadSavedGame() {
		LoadChecker = PlayerPrefs.GetString("LoadChecker");
		if (LoadChecker == null) {
			Debug.Log("No Save Data Available To Load From");
		} else {
			SceneManager.LoadScene(PlayerPrefs.GetString("LoadString"));
		}
	}

	public void SaveLevelData() {
		if (myscene.name == "level1") {
			PlayerPrefs.SetString("LoadString", myscene.name);
			LoadChecker = "true";
			PlayerPrefs.SetString("LoadChecker", LoadChecker);
			PlayerPrefs.Save();
			Debug.Log("Working");
		}

		if (myscene.name == "level2") {
			PlayerPrefs.SetString("LoadString", myscene.name);
			LoadChecker = "true";
			PlayerPrefs.SetString("LoadChecker", LoadChecker);
			PlayerPrefs.Save();
		}
    }
}

Set your ‘myscene’ variable in Start instead of outside. Example:

Scene myscene;

void Start()
{
myscene = SceneManager.GetActiveScene();
}

That should fix it. :slight_smile:

Well, just as the error said:

Constructors and field initializers
will be executed from the loading
thread when loading a scene.

In this line:

Scene myscene = SceneManager.GetActiveScene();

you call SceneManager.GetActiveScene() inside the field initializer. You should call it inside a method instead. So either call it in “Awake” or directly inside your SaveLevelData method.

Scene myscene;

void Awake()
{
    myscene = SceneManager.GetActiveScene();
}