CS2335
Master 1.0.0
Master 1.0.0
  • Introduction
  • Introduction
    • Introduction
      • Game Design
    • Unity - Download
    • Visual Studio - IDE
    • Unity Manual, Scripting API
  • Unity Basics
    • Unity Editor Windows
    • Behavior Components
    • 2D Project, Scenes
      • Create 2D Sprite GameObject
      • Create UI-Text GameObject
    • MonoBehavior - Base-Class
    • Create a Custom C# Script
  • Game Coding Structures
    • Games Overview
    • Unity Engine - Event Functions
    • Finite State Machines
    • UML Class Diagram
  • Animation
    • Animator Controller
    • Animation Steps
      • Optional: Dead Animation
    • PlayerController.cs V0
  • Project 1 - Player
    • Player GameObject v1
      • C# Generics, Statics
    • Player GameObject - Jump
    • PlayerController.cs V2-Jump
    • PickUp PreFabs
      • Sorting Layers
    • PlayerController.cs V3-Collide
    • GameData Version1
    • GameData Version2
    • PlayerController V4-Score
  • Project 1 Details
    • Project1 GameObjects
    • PlayerStats Version1
      • UI-Canvas
    • Utility Class
    • Simple Spawner
    • MiniGameManager
      • Logic Diagrams
      • StartButton
      • ResultsPanel
  • Project1 Enhancements
    • PickUp - SelfDestruct
    • Spawn from List of Prefabs
  • Project 2 - StateManager
    • Project 2 - Learning Objectives
      • Inspiration
        • Branching Story Structures
        • Branching Structures
        • Hero's Journey
        • Visual Novel in Unity-Links
    • Project 2 - Starter Assets
    • State Machine Framework
    • StateManager - Singleton Design Pattern
    • Interface IStateBase
    • Create SceneXState.cs
    • OptionPanel Prefab
      • UI Images: Sprite Sheets
      • Button Image-Transitions
    • Project 2 - List of Steps
    • Project 2 - Starter Code
  • Project 2 -Dialogue
    • Hide_Show_Panel Script
    • Edit OptionPanel
    • Simple DialogPrefab
    • Conversation Entry
    • SimpleDialog.cs
    • ScriptableObjects
      • Scriptable Object Factory
    • Conversation Scriptable Objects
    • DialogManager_ConvList
      • DialogManager V2
      • Coroutines: Dynamic Text
      • DialogPrefab wImage
  • Overview: Branching Logic
    • DialogTrigger
    • Dictionary Data-Structure
      • Unity PlayerPrefs Dictionary
    • GameData Version3
    • Dictionary: choiceData
      • SaveChoice, ChoicePanel
        • choiceData - examples
          • Dictionary Value to Disable Options
    • Configure UI-Button Listeners
      • NPC Animation
      • NPC Activation
    • UI-Triggered Animations
    • Simple Inventory
    • EndState Conditions
    • Script ExecutionOrder
    • Custom UnityEvents
    • PlayerStats v2
      • ModifyPlayerData
      • BuyItem
    • Text Input
  • UI Components
    • Finding Game Objects
    • Game Objects: UI vs. 2D Sprite
    • UI Elements
      • Canvas: Screen-Space Render-Mode
      • UI-Buttons To Change Scene
  • Proj4: Inventory System
    • Inventory-System
      • GameData version4
      • 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
  • Custom Unity Events
    • Event Publishing Patterns
    • Custom Event Messaging
  • Proj4: Mini-Game
    • Simplified Mini-Game
      • PlayerController_v2 Mods
        • PlayerController_v2_final
      • MiniGameManager_v2
    • MiniGame-Overview-Proj4
    • LevelManager
      • LevelManager Logic Diagram
      • LevelManager FSM
      • LoadLevel, StartLevel Logic
      • Code Framework
    • Timer
  • Project 4 - Code Mods
    • Project 4 - Steps
    • Project 4 - 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
      • Particle Systems
      • Adding Audio
      • Screen Fading and Reloading
      • ScriptableObjects
      • Disable Debug Logging
      • Events and Actions
      • Saving Data - Serialization
      • Parallax Scrolling
      • Change Sprites
    • XR - Extended Reality
  • Computing Concepts
    • Programming Patterns
      • State - FSM
      • Singleton Pattern
    • C# Language
      • Variables
      • Delegates
      • Dictionary
      • Enum
      • Encapsulation
        • C# Properties
        • Access Modifiers
      • Generics < T >
      • Inheritance
      • Interface
      • List< T >
      • Polymorphism
      • Queue< T >
      • Switch-Case
      • Foreach
      • Static
      • Ternary Operator: ?
      • this
    • Diagrams
      • State Machine Framework
      • UML Class Diagrams
      • Level Manager Logic Diagram
      • Flow-Chart: NumberGame
      • FSM: NumberGame
    • Tools
    • 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. Proj4: 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