Help with Non-Linear Levels

Hello fellow Unity Users!
I have a bit of an abstract question - I do have a sketch of the flow, and I’'l post that as well.
Here goes:
I have a “game” that has non-linear levels. Meaning, the level progression isn’t 1 - 2 - 3 - 4 - etc.
It works like this:
Level one is unlocked (we know this is the ONLY level the user can choose and complete).
Once level one is complete, it unlocks level 2, 3 and 4. This is where it gets tricky:
The User can now choose to complete either 2 or 3 or 4. Once they have completed ANY ONE of those levels, level 5 and 6 become unlocked. Now, there are 2 levels complete (Level 1 + another one) and 4 levels unlocked. The user can now choose any one of the 4 remaining levels. Once they make their choice and complete it, levels 7 and 8 become unlocked. Luckily, my game only has 8 levels, so once levels 7 and 8 become unlocked, it may be easier to keep track of.

Now, in addition to this unlocking of levels, I also want the user to earn a badge for the type of level they have completed. For example, they complete the first level, they earn the Shrink badge. When they complete the next level - if they choose level 4 for example, they’ll earn the Fire badge, but if they choose level 2, they would earn the Fall badge.

My Unity project is laid out like this:
I have what I call a SCENARIOS scene, this is the scene where my level icons are laid out.
Then I have a separate scene for each level. i.e.: a scene for SHRINK (Level 1), one for FIRE (Level 4) etc. there are 8 of these types of Scenes. Each of these scenes are a self-contained game.
Then I have a scene called BADGES - this is where the individual badge icons live once they are earned.

So, if you look at the schematic drawing:

  1. is the first known level.
  2. are the 3 choices that get unlocked after the first level is complete. One of these 3 will be completed, then
  3. are the next 2 choice that get unlocked after the one from 2. is complete. this leaves 4 levels to choose from
  4. are the next 2 levels to be unlocked, after one of the 4 choices have been completed.

Anyway, I hope that makes sense.

Now, I have been trying to figure this out. LET ME PREFACE: I am NOT a programmer, but Im trying to learn. Please be gentle.

I have tried this:

using UnityEngine;
using System.Collections;

public class GameManager : MonoBehaviour {

	// This is The Highlander -- there can be only one.
	// This is a singleton object.

	private static GameManager instance = null;

	private bool completedShrink = false;
    private bool completedSlipFall = false;

    private int sceneCount = 0;

	void Awake()
		// Implement the singleton pattern
		if (instance == null)
			// This is the first object
			instance = this;

			Debug.Log("Game Manager Object Singleton has been set");
		else if (instance != this)
			// This is not the first instance
			Debug.Log("Game Manager Object Imposter destroyed");

	public static GameManager Instance
			return GameManager.instance;

	public void CompleteShrink()
        completedShrink = true;
        Debug.Log("Shrink scene completed, scene count = " + sceneCount.ToString());

    public void CompleteSlipFall()
        completedSlipFall = true;
        Debug.Log("Slip and Fall Prevention scene completed, scene count = " + sceneCount.ToString());

    public bool IsShrinkComplete()
        return completedShrink;

    public bool IsSlipFallComplete()
        return completedSlipFall;


This code only shows 2 scenarios, in the effort to be brief. This code is attached to an Empty Game object called GameManagerObject.

Then I have this:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class ScenariosUIManager : MonoBehaviour {

	public GameObject ShrinkLocked;
	public GameObject ShrinkActive;
	public GameObject ShrinkAward;

	public GameObject SlipFallLocked;
	public GameObject SlipFallActive;
	public GameObject SlipFallAward;

	public GameObject ProductRotationLocked;
	public GameObject ProductRotationActive;
	public GameObject ProductRotationAward;

	public GameObject FireSafetyLocked;
	public GameObject FireSafetyActive;
	public GameObject FireSafetyAward;

	// Use this for initialization
	void Start () {
		if (GameManager.Instance.IsShrinkComplete() == true)
			ShrinkActive.SetActive (false);
			ShrinkAward.SetActive (true);
			SlipFallActive.SetActive (true);
			ProductRotationActive.SetActive (true);
			FireSafetyActive.SetActive (true);
		if (GameManager.Instance.IsSlipFallComplete() || GameManager.Instance.IsProductRotationComplete() || GameManager.Instance.IsFireSafetyComplete())
			ProShopliftingActive.SetActive (true);
			ErgonomicsActive.SetActive (true);
		if (GameManager.Instance.IsSlipFallComplete())
			SlipFallActive.SetActive (false);
			SlipFallAward.SetActive (true);
		if (GameManager.Instance.IsProductRotationComplete())
			ProductRotationActive.SetActive (false);
			ProductRotationAward.SetActive (true);
		if (GameManager.Instance.IsFireSafetyComplete())
			FireSafetyActive.SetActive (false);
			FireSafetyAward.SetActive (true);

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

This was attached to the UI of the Scenarios scene.

Anyway… needless to say: it does;t work… AND I never even addressed the badges.

I feel like I’m close, but as a non-programmer, I feel like I’m stumbling around in the dark. Or perhaps a better analogy is this: I’m trying to write a book in German, but I don’t understand the language, so I’m just typing words on the screen, and hoping they make sentences.

Would anyone care to hold my hand?


Yeah, what you want sounds super easy to implement for a real programmer (I think I can do this in 1 or 2 hours max). But super hard to handle for a non-programmer.

Because what you needs here it’s understanding OOP ^^. You need to have a model that describe what a level is. A level is an object that has :

  • An id
  • A state locked/unlocked
  • A state completed/not completed
  • A list of level to unlock when completed
  • A list of badges to give to the user when completed

Then your GameManager has a list of levels. And your UI gets this list of levels from the GameManager and just display them if they have their state unlocked.

I can help you with this if you have the motivation.