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
  • GameData Custom Events:
  • Use custom events to implement logic for the end of the MiniGame:
  • Have MiniGState Subscribe to Custom Event onMiniGameEnd
  • Custom event in GameData: onPlayerDataUpdate
  • Custom event in Player Controller: onPlayerDied
  • Custom event in LevelManager: onMiniGameEnd
  • MiniGState Code - Subscribe to Event: OnMiniGameEnd
  • LevelManager code to Trigger GameData: MiniGameOver( )

Was this helpful?

  1. Custom Unity Events

Custom Event Messaging

In our game application, we have several situations where it will be beneficial to define events for an object. We have already worked with the UI-Button object's Click() method which raises the OnClick event. In these cases, we defined an Event-handler method that we wanted to be executed when the OnClick event occured. In order to associate our Event-handler method with the Button's onClick event, we had to use the Button.onClick.AddListener( ) method. The AddListener( ) method has a delegate as the input parameter, where the delegate defines the format of a function/method that matches a specific function/ method signature.

GameData Custom Events:

Since our GameData object instance is persisted across all scenes, then we need to be careful not to create code dependencies between GameData and objects that are only in one specific scene. The GameData object needs to communicate with other gameObjects, but the best way to have communication to reduce tight coupling between objects is to use custom events. GameData will be an event publisher, objects within a scene can subscribe to GameData events, to recieve notification (and event data) when events have occurred.

onPlayerDataUpdate, onInventoryUpdate, OnPlayerDied, OnMiniGameOver

For the events above, can you identify a likely publisher object. Can you identify one or more likely subscribers for each message?

Use custom events to implement logic for the end of the MiniGame:

What is the event that causes the mini-game to end? Player’s score has changed?, or some player collision event? (for a positive or destructive object). If that’s the case, then when that event happens we need to be able to check whether player-data has reached some threshold value which will cause the level to end, for example, maybe the player has died based on a collision with a destructive force. If the miniGame ends due to a data-changing event, then the onPlayerDataUpdate event in GameData can be used by different objects as notification to check for the end of the miniGame.

The problem with the current activeState is that we don’t know how to execute a method on an instance of that object since we can’t easily access that object as a component of a gameObject.

Have MiniGState Subscribe to Custom Event onMiniGameEnd

MiniGState subscribe to a custom event from some other class: - to notify the MiniGState when the MiniGame has ended, so it is notified it is time to switch scene /state.

We can assume that all information that we need, to determine which is the next state, is stored in GameData….and that we can get that data as part of the We'll assume that the MiniG State object can use gameData information to logically infer what is the next state/scene to go to.

PlayerController is the first gameObject that has an event that corresponds to the player dying due to a non-data event. There are at least 2 situations to consider. 1: a data-event has occured, but the playerController must wait until the Animator controller has completed playing a dead animation clip. 2: a non-data event, such as steping into water can cause the player to die. Because no data is generated, we can't rely on GameData onPlayerDataUpdate to notify other objects. Instead, we can have the LevelManager subscribe to an onPlayerDied event published by the PlayerController.

Custom event in GameData: onPlayerDataUpdate

public UnityEvent OnPlayerDataUpdated

Custom event in Player Controller: onPlayerDied

public UnityEvent OnPlayerDied

Custom event in LevelManager: onMiniGameEnd

Call this method when the miniGame is over, then onMiniGameEnd event will be broadcast to send notification to subscribing objects.

public UnityEvent OnMiniGameEnd
//GameData method, will be executed by LevelManager or MiniGameManager code.

public void miniGameIsOver( ){
        if (onMiniGameEnd != null) {  // some object instance has subscribed for notification
            onMiniGameEnd (this, playerData);  // execute event - send updated playerData
        }
    }

MiniGState Code - Subscribe to Event: OnMiniGameEnd

In MiniGState we need to do 2 things: 1. Create a method: ChangeScene() that matches the can be added as a listener to be executed OnMiniGameEnd.

//In MiniGState
public void InitializeObjectRefs (){

        GameData.instanceRef.onMiniGameEnd.AddListener( ChangeScene);  // our event-handler code - added as a listener / subscriber to the event
            }

///method to be executed when event notification is received.

public void ChangeScene( ){
        if (e.totalScore > maxLevelScore) {  // go to winning condition state
             managerRef.SwitchState (new WinState ());
            Application.LoadLevel ("winScene");
        } else {  // go to losing condition state
            managerRef.SwitchState (new LoseState ());
            Application.LoadLevel ("LoseScene");

        }
    }

LevelManager code to Trigger GameData: MiniGameOver( )

This cascading trail of code is initially triggered from within MiniGameManager - this is where the chain of events starts for changing state/scene to end the MiniGame

void nextLevel(){
        switch(curLevel){
        case LevelState.Start:
            Debug.Log ("State changed - goto :LoadLevel 1");
            curLevel = LevelState.Level1;
            LoadLevel1 ();
            break;
        case LevelState.Level1:
            curLevel = LevelState.Level2;
            LoadLevel2 ();
            break;
        case LevelState.Level2:
            curLevel = LevelState.Level3;
            LoadLevel3 ();
            break;
        case LevelState.Level3:  //when we're in Level3 and nextLevel() gets called, then we know the minigame is over
            gameData.miniGameIsOver();  //this gameData method will trigger the event to change scenes 
            break;
        }
    }
PreviousEvent Publishing PatternsNextSimplified Mini-Game

Last updated 4 years ago

Was this helpful?