- Home /
BEGINNER: why is my main menu not loading level 1 when I press play?
Hello! need help my play button was working just fine and loading level 1 but now when I click it it does nothing please help :( :
using UnityEngine.SceneManagement;
using UnityEngine;
using System.Collections;
public class MainMenu : MonoBehaviour {
public GUISkin skin;
void OnGUI()
{
GUI.skin = skin;
GUI.Label (new Rect (10,10, 400,45), "Go Home");
if (PlayerPrefs.GetInt("Level Completed") > 0)
{
if (GUI.Button(new Rect(10, 60, 100, 45), "Play"))
{
SceneManager.LoadScene(PlayerPrefs.GetInt("Level Completed"));
SceneManager.LoadScene(0);
}
}
if (GUI.Button(new Rect(10, 60, 100, 45), "Play"))
{
PlayerPrefs.SetInt("Level Completed", 0);
SceneManager.LoadScene(0);
}
if (GUI.Button (new Rect (10, 210, 100, 45), "Quit"))
{
Application.Quit();
}
}
}
and this is my GAME MANAGER:
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameManager : MonoBehaviour
{
// Count
public int currentScore;
public int highscore;
public int token;
public int tokenCount;
private int totalTokenCount;
public int currentLevel = 0;
public int unlockedLevel;
//Timer Variables
public Rect timerRect;
public Color warningColorTimer;
public Color defaultColorTimer;
public float startTime;
private string currentTime;
//References
public GameObject tokenParent;
void Update()
{
startTime -= Time.deltaTime;
currentTime = string.Format("{0:0.0}", startTime);
if (startTime <= 0)
{
startTime = 0;
Destroy(gameObject);
SceneManager.LoadScene(0);
}
}
void Start()
{
totalTokenCount = tokenParent.transform.childCount;
if (PlayerPrefs.GetInt("Level Completed") > 0)
{
currentLevel = PlayerPrefs.GetInt("Level Completed");
} else {
currentLevel = 0;
}
//DontDestroyOnLoad(gameObject);
}
public void CompleteLevel()
{
if (currentLevel < 3)
{
currentLevel += 3;
PlayerPrefs.SetInt("Level Completed", currentLevel);
PlayerPrefs.SetInt("Level " + currentLevel.ToString() + " score ", currentScore);
SceneManager.LoadScene(currentLevel);
} else {
print("You Win!");
}
}
public void AddToken()
{
tokenCount += 1;
}
//GUI SKI
public GUISkin skin;
private void OnGUI()
{
GUI.skin = skin;
if (startTime < 5f)
{
skin.GetStyle("Timer").normal.textColor = warningColorTimer;
} else {
skin.GetStyle("Timer").normal.textColor = defaultColorTimer;
}
GUI.Label(timerRect, currentTime, skin.GetStyle ("Timer"));
GUI.Label(new Rect(45, 100, 200, 200), tokenCount.ToString() + "/" + totalTokenCount.ToString());
}
}
Answer by Feelnside · Jun 21, 2018 at 07:25 PM
Feel free to use the following ScenesManager.cs To use it just call the following function: ScenesManager.Instance.loadScene("scene_name"); (also you can use an int number instead of string name)
Let me know if you have any problems with the script.
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
/// <summary>
/// Use it to load a new scene
/// </summary>
public class ScenesManager : MonoBehaviour
{
public static ScenesManager Instance { get; private set; }
AsyncOperation ao;
string scene_name;
void Awake()
{
Instance = this;
}
void OnEnable()
{
SceneManager.sceneLoaded += OnSceneLoaded;
}
void OnDisable()
{
SceneManager.sceneLoaded -= OnSceneLoaded;
}
/// <summary>
/// It's called each time once scene is loaded
/// </summary>
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
//feel free to add here any logic once a scene is loaded
}
/// <summary>
/// Current Scene. Use it to get the Scene Index
/// </summary>
public static int CurrentScene
{
get
{
return SceneManager.GetActiveScene().buildIndex;
}
}
public static string CurrentSceneName
{
get
{
return SceneManager.GetActiveScene().name;
}
}
/// <summary>
/// Load a specific scene
/// </summary>
/// <param name="scene">A string name of the scene</param>
public void loadScene(string scene)
{
SceneManager.LoadScene(scene, LoadSceneMode.Single);
}
/// <summary>
/// Load a specific scene
/// </summary>
/// <param name="sceneIndex">A buildIndex of the scene</param>
public void loadScene(int sceneIndex)
{
SceneManager.LoadScene(sceneIndex, LoadSceneMode.Single);
}
/// <summary>
/// Load a specific scene in Async
/// </summary>
/// <param name="scene">A name of the scene</param>
public void loadSceneAsync(string scene)
{
scene_name = scene;
Invoke("StartLoad", 0.5f);
}
void StartLoad()
{
StartCoroutine(AsynchronousLoad());
Invoke("ActivateScene", 1f);
}
IEnumerator AsynchronousLoad()
{
ao = SceneManager.LoadSceneAsync(scene_name);
ao.allowSceneActivation = false;
yield return ao;
}
void ActivateScene()
{
ao.allowSceneActivation = true;
}
}
sorry I am total noob so I am having trouble plugging things in without getting a bunch of errors on my other scripts :/ any way I can fix the ones I currently have?
Just reviewed the code:
if (PlayerPrefs.GetInt("Level Completed") > 0)
{
if (GUI.Button(new Rect(10, 60, 100, 45), "Play"))
{
Scene$$anonymous$$anager.LoadScene(PlayerPrefs.GetInt("Level Completed"));
Scene$$anonymous$$anager.LoadScene(0);
//Looks like this line should be removed?!
}
}
You are trying to load the Level Completed scene and at the same time you are loading the Scene with the zero index. In this way the Zero level will be loaded any time once the Play button is clicked. Review these lines. Probably you need to remove the second one.
also totally using this template in the future thank you!