CS2335
Master_v2
Master_v2
  • Introduction
  • Introduction
    • Introduction
      • Design
      • Game Design
    • Unity - Download
    • Visual Studio - IDE
    • Hero's Journey
  • Unity Basics
    • Unity Editor Windows
    • MonoBehavior - Base-Class
    • Unity Engine - Event Functions
  • Getting Started
    • UI-Elements
    • Animator Controller
      • Animation Steps
    • PlayerController Flow Chart
    • PlayerController Code
      • PlayerController - V1 - S20
      • PlayerController V2 S20
      • PlayerController V3 S20
  • Project 1 - Simple Game
    • Overview
    • Project 1 - Get Started
      • UML Class Diagram
    • Player GameObject
      • PlayerController.cs V2
      • PlayerController.cs V3
    • Create 2D Sprite Prefab: Rock
    • Sorting Layers
  • Project1 Code
    • PickUp PreFabs
    • Player GameObject
    • PlayerController - jump
    • GameData Version1
    • PlayerStats Version1
    • MiniGameManager
      • Logic Diagram
    • Simple Spawner
    • Utility Class
  • Project1 Enhancements
    • PickUp - SelfDestruct
    • Spawn from List of Prefabs
  • Project 2 - StateManager
    • Project 2 - Learning Objectives
    • Project 2 - Starter Assets
    • Project 2
      • State Machine Framework
        • Singleton Pattern
      • StateManager - Singleton Design Pattern
      • IStateBase, BeginState
      • Project 2 -Steps: Create new Scene and State
      • Project 2 - List of Steps
        • Project 2 - Starter Code
  • Project 2 -Dialog
    • Hide_Show_Panel Script
    • Configure TitlePanel, DecisionPanel
    • Simple Dialog Prefab
    • Conversation Scriptable Objects
    • DialogManager_ConvList
    • Image Transitions for Buttons
  • UI Components
    • Finding Game Objects
    • Game Objects: UI vs. 2D Sprite
    • UI Elements
      • Canvas: Screen-Space Render-Mode
      • UI-Buttons To Change Scene
      • Text Input
  • Project2 Resources
    • Visual Novel in Unity-Links
    • Scriptable Object Factory
      • ScriptableObjects
    • Dialog Prefab Packages
  • Project 3 - Overview
    • Branching Story Structures
    • Dictionary Data-Structure
      • Unity PlayerPrefs Dictionary
    • Dictionary: User-Choice Data
      • User-Choices - Example
        • Dictionary Value to Disable Options
    • Simplified Mini-Game
      • PlayerController_v2 Mods
        • PlayerController_v2_final
      • MiniGameManager_v2
  • Proj3: Inventory System
    • Inventory-System
      • Install and Configure
      • Diagrams, Resources
        • Item, Gem, Potion Classes
        • Inventory Class
      • InventoryDisplay, Slot UI
        • InventoryDisplay Class
        • Slot Class
        • Hazard Class
        • Layout Groups
      • Customization Steps
        • Configure Animation
        • AddItem Button
        • Concrete Class: Food
        • MiniGame Mods
          • PlayerController Mods
      • Code: InventorySystem
        • GameData, PickUp Mods
      • Resources: Data Structures
  • Proj3: Custom UnityEvents
    • Event Publishing Patterns
    • Custom Event Messaging
  • Proj3: Mini-Game
    • MiniGame-Overview-Proj3
    • LevelManager
      • LevelManager Logic Diagram
      • LevelManager FSM
      • LoadLevel, StartLevel Logic
      • Code Framework
    • Timer
  • Project 3 - Code Mods
    • Project 3 - Steps
    • Project 3 - Code
      • Code: Final Versions
        • PlayerController Mods
          • PlayerController_v2 Mods
        • GameData - Final
        • LevelManager
        • PlayerStats - Final
        • PickUp, Hazard, ScorePickUp
        • Spawner - Final
        • CameraFollow
        • ScreenFader
        • MiniGameState
        • Example: EndState
      • MiniGameWin Logic
  • Optional, Supplemental Content
    • Optional Content
      • Adding Audio
      • Screen Fading and Reloading
      • ScriptableObjects
      • Disable Debug Logging
      • Events and Actions
      • Saving Data - Serialization
      • Parallax Scrolling
      • Change Sprites
  • C# Language
    • C# Language
      • Variables
      • Enum
      • Encapsulation
        • C# Properties
        • Access Modifiers
      • Inheritance
      • Polymorphism
      • Interface
      • Switch-Case
      • List< T >
      • Queue< T >
      • Dictionary
      • Foreach
      • Static
      • Ternary Operator: ?
      • this
      • Delegates
    • Diagrams
      • State Machine Framework
      • UML Class Diagrams
      • Level Manager Logic Diagram
      • Flow-Chart: NumberGame
      • FSM: NumberGame
    • Glossary
    • References and Resources
    • Random Thoughts
Powered by GitBook
On this page
  • LevelManager Class
  • Level-State Enums
  • Declare LevelManager Object Reference Variables
  • Start - Initialize Object References
  • Check For Level End
  • NextLevel - Finite State Machine Logic
  • LoadLevel Methods
  • Full Starter Code: Updated 4/15/2020

Was this helpful?

  1. Proj3: Mini-Game
  2. LevelManager

Code Framework

PreviousLoadLevel, StartLevel LogicNextTimer

Last updated 5 years ago

Was this helpful?

LevelManager Class

This page specifies each step in creating starter code framework for the LevelManager. Go to the of this page to get the full Starter Code

Start by adding the following code to the top of the LevelManager Class

Updated 4/15/2020 1:00 pm

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

public class LevelManager : MonoBehaviour {

        ///CODE TO BE ADDED HERE

} //end class

Level-State Enums

The next code we'll add to the LevelManager class is a set of Enums that are used to track which state we are in. We'll create a LevelState variable: curLevel, and it's value will change as the Level changes. This corresponds to a simple Finite State Machine for managing levels.

public enum LevelState
{
    start,
    level1,
    level2,
    level3,
    win,
    lose

}

Declare LevelManager Object Reference Variables

After declaring the LevelState enums, then we'll declare the LevelManager's object reference variables.

   LevelState curLevel; //track current level for FSM

    //levelScore is stored in GameData
    int maxLevelScore; //when to change levels

    //UI game Objects - LevelText, StartGameButton, StartGamePanel
    [SerializeField]
    Button startGameButton;

    [SerializeField]
    CanvasGroup startPanelCg;

    [SerializeField]
    Text levelText;

    //references to custom script components
    [SerializeField]
    Spawner spawner;
    //to start the spawner, change objects that are spawned

Start - Initialize Object References

Add the following code to the Start( ) method.

void Start()
    {
        curLevel = LevelState.start;

        maxLevelScore = 30;  //ADJUST FOR YOUR GAME
        startGameButton.onClick.AddListener(NextLevel);

        levelText.text = "";

        Utility.ShowCG(startPanelCg);  //show StartButton

       ///REGISTER AS A LISTENER TO GameData event: OnPlayerDataUpdate
        GameData.instanceRef.onPlayerDataUpdate.AddListener(CheckLevelEnd);

        PlayerController player = FindObjectOfType<PlayerController>();
        if( player != null)
        {
            player.onPlayerDied.AddListener(ReloadMiniGame);
        }
    }

Check For Level End

Write code for the CheckLevelEnd method, this method will be executed every time the OnPlayerDataUpdate event occurs in GameData.

   /// <summary>
    /// Checks the level end.
    ///   If LevelScore > maxLevelScore, then reset the LevelScore and call the nextLevel( ) method
    ///  to change the level
    /// </summary>
    ///this will be called when the OnPlayerDataUpdate event 
    ///happens in GameData, it is registered as a listener for that event

    public void CheckLevelEnd()
    {
        int levelScore = GameData.instanceRef.LevelScore;
        Debug.Log("Check if level is over" + levelScore);

        if (levelScore >= maxLevelScore)
        { ///level has changed

            GameData.instanceRef.LevelScore = 0;   //reset GameData.LevelScore

            NextLevel();  //go to next level
        }

    } //end CheckLevelEnd

NextLevel - Finite State Machine Logic

This method manages the FSM control logic using switch-case structure. Each time this method is called, the matching logic must change the value of curLevel, and call a custom method: loadLevelX( ) where the details of the level loading logic are specified.

 //FSM LOGIC 
    //Every time NextLevel is executed, we KNOW that it is time to change the level
    public void NextLevel()
    {

        switch (curLevel)
        {

            case LevelState.start:  // called when StartPanel, StartGameButton is clicked
                curLevel = LevelState.level1; //change level
                LoadLevel1();
                break;

            case LevelState.level1:  //called when in Level1 from checkLevelEnd( ) 
                curLevel = LevelState.level2; //change level

                LoadLevel2();
                break;
            case LevelState.level2: //called when in Level2 from checkLevelEnd( ) 
                curLevel = LevelState.level3; //change level

                LoadLevel3();
                break;
            case LevelState.level3: //called when in Level3 from checkLevelEnd( ) 
                //ADD logic to determine if it's a winning or losing ending

                MiniGameOver();
                break;

            default:
                Debug.Log("No match on curLevel");
                break;
        }
    } //end NextLevel

LoadLevel Methods

For each level change, a method: loadLevelX( )contains the level change logic. You'll need to add additional LoadLevel Methods for loadLevel3( ), etc.

//These will need to be updated with your code
    void LoadLevel1()
    {
        //STARTS Gameplay, Spawner, etc

        Utility.HideCG(startPanelCg); //hide the StartGamePanel and StartGameButton
        spawner.activeSpawning = true;
        spawner.StartSpawning();
        levelText.text = "Level 1";
        Debug.Log("LoadLevel1");
    }

    void LoadLevel2()
    {
        ///change background image?
        ///change objects getting spawned?
       
        levelText.text = "Level 2";
        Debug.Log("LoadLevel2");
    }

    void LoadLevel3()
    {
        ///change background image?
        ///change objects getting spawned?

        levelText.text = "Level 3";

    }

    void MiniGameOver()
    {


    }

Full Starter Code: Updated 4/15/2020

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class LevelManager : MonoBehaviour
{
    public enum LevelState
    {
        start,
        level1,
        level2,
        level3,
        win,
        lose

    }

    LevelState curLevel; //track current level for FSM

    //levelScore is stored in GameData
    int maxLevelScore; //when to change levels

    //UI game Objects - LevelText, StartGameButton, StartGamePanel
    [SerializeField]
    Button startGameButton;

    [SerializeField]
    CanvasGroup startPanelCg;

    [SerializeField]
    Text levelText;

    //references to custom script components
    [SerializeField]
    Spawner spawner;
    //to start the spawner, change objects that are spawned

    void Start()
    {
        curLevel = LevelState.start;

        maxLevelScore = 30;  //ADJUST FOR YOUR GAME
        startGameButton.onClick.AddListener(NextLevel);

        levelText.text = "";

        Utility.ShowCG(startPanelCg);  //show StartButton

       ///REGISTER AS A LISTENER TO GameData event: OnPlayerDataUpdate
        GameData.instanceRef.onPlayerDataUpdate.AddListener(CheckLevelEnd);

       
    }

    /// <summary>
    /// Checks the level end.
    ///   If LevelScore > maxLevelScore, then reset the LevelScore and call the nextLevel( ) method
    ///  to change the level
    /// </summary>
    ///this will be called when the OnPlayerDataUpdate event 
    ///happens in GameData, it is registered as a listener for that event

    public void CheckLevelEnd()
    {
        int levelScore = GameData.instanceRef.LevelScore;
        Debug.Log("Check if level is over" + levelScore);

        if (levelScore >= maxLevelScore)
        { ///level has changed

            GameData.instanceRef.LevelScore = 0;   //reset GameData.LevelScore

            NextLevel();  //go to next level
        }

    } //end CheckLevelEnd


    //FSM LOGIC 
    //Every time NextLevel is executed, we KNOW that it is time to change the level
    public void NextLevel()
    {

        switch (curLevel)
        {

            case LevelState.start:  // called when StartPanel, StartGameButton is clicked
                curLevel = LevelState.level1; //change level
                StartLevel1();
                break;

            case LevelState.level1:  //called when in Level1 from checkLevelEnd( ) 
                curLevel = LevelState.level2; //change level

                LoadLevel2();
                break;
            case LevelState.level2: //called when in Level2 from checkLevelEnd( ) 
                curLevel = LevelState.level3; //change level

                LoadLevel3();
                break;
            case LevelState.level3: //called when in Level3 from checkLevelEnd( ) 
                //ADD logic to determine if it's a winning or losing ending

                MiniGameOver();
                break;

            default:
                Debug.Log("No match on curLevel");
                break;
        }
    } //end NextLevel


    void StartLevel1()
    {
        //STARTS Gameplay, Spawner, etc

        Utility.HideCG(startPanelCg); //hide the StartGamePanel and StartGameButton
        spawner.activeSpawning = true;
        spawner.StartSpawning();
        levelText.text = "Level 1";
        Debug.Log("LoadLevel1");
    }

    void LoadLevel2()
    {
        ///change background image?
        ///change objects getting spawned?
       
        levelText.text = "Level 2";
        Debug.Log("LoadLevel2");
    }

    void LoadLevel3()
    {
        ///change background image?
        ///change objects getting spawned?

        levelText.text = "Level 3";

    }

    void MiniGameOver()
    {


    }


    public void ReloadMiniGame()
    {
        Utility.ShowCG(startPanelCg); //show start button
        GameData.instanceRef.ResetMiniGameData();
    }


} //end LevelManager
bottom