This script will be on emptyGameObject: MiniGameManager You'll need to populate public fields in the inspector once you have created the other required gameObjects. See Images below:
Put Script on an empty gameObject in the Scene.
Overview - MiniGameManager.cs:
The MiniGameManager Class manages logic for:
Start Button to Start Gameplay
Function ReStartGame( ) is executed when the StartButton is clicked
Resets GameData
Hides the Results Panel:
Sets the curGameState to MiniGameState.active
Hide the StartButton so it's inactive (hidden)
Set the SpawneractiveSpawning = true
Execute Spawner StartSpawning( ) method.
Polling - Code Executed in Update( ): - Checked Every Frame
Checks to determine what thecurrent value of curGameState
if curGameState ==MiniGameState.active
Check that Health is still greater than 0
If Health is Greater than 0
Check Score, if Score > WinScore
Set MiniGameState.Win
Set win text for ResultsText.text
Call GameOver( )
Else if Health is Less than or equal to 0
Set MiniGameState.Lose
Set lose text for ResultsText.text
Call GameOver( )
GameOver( ) Method
ShowResultsPanel ( Use Utility to set CanvasGroup values)
Show StartButton - setActive is true, makes visible
Stop Spawner by activeSpawning = false
Spawner: StopAllSpawning( )Also destroys all spawned objects
Code MiniGameState, MiniGameManager
See Version2 below for Included Spawner Code
//Updated Sept 17 2020using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; //Required for modifying any UI elementpublicclassMiniGameManager : MonoBehaviour{enumMiniGameState { idle, active, win, lose } [SerializeField]MiniGameState curGameState;//TODO Add Spawner [SerializeField]Button startButton; //Button component on the StartButton gameObject [SerializeField]Text resultsText; //Text component on the ResultsText gameObject [SerializeField]CanvasGroup resultsPanelCG; //canvas group component on the ResultsPanel [SerializeField]int winScore =30;// Start is called before the first frame updatevoidStart() { curGameState =MiniGameState.idle;resultsText.text="Score "+ winScore +" To Win";Utility.ShowCG(resultsPanelCG); //make sure panel is visiblestartButton.onClick.AddListener(ReStartGame); //IMPORTANT - Method to be exectued when onClick event happens }// Update is called once per framevoidUpdate() {if (curGameState ==MiniGameState.active) {if (GameData.instanceRef.Health>0) {if (GameData.instanceRef.Score>= winScore) {//won the game curGameState =MiniGameState.win;resultsText.text="You are a winner";GameOver(); } }else//lost due to health { curGameState =MiniGameState.lose;resultsText.text="You lost, so sorry, try again";GameOver(); } } //end if } //end Update/// <summary>/// Restart the game/// </summary>/// Syntax for a method to be executed by a Unity Event/// MUST BE PUBLIC to be executed by Unity EVENTpublicvoidReStartGame() //important syntax {GameData.instanceRef.ResetGameData(); //use singleton variable to call public methodUtility.HideCG(resultsPanelCG); //toggle to hide panel curGameState =MiniGameState.active;startButton.gameObject.SetActive(false);//TODO //start spawner }/// <summary>/// Games the over./// Private since only executed from within this class/// </summary>privatevoidGameOver() {Utility.ShowCG(resultsPanelCG); //toggle to make visible///TODO stop spawner, destroy all spawned objects/// Get Text that is the child of the StartButtonstartButton.gameObject.SetActive(true); //must set gameObject to active before finding child textText btnText =startButton.GetComponentInChildren<Text>();btnText.text="Play Again"; }}//end class
Version 2 - With Spawner Code Added
The code below is a simplified version, either version should work, select the one you prefer
//Sept 17, 2020using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI; //Required for modifying any UI elementpublicclassMiniGameManager : MonoBehaviour{enumMiniGameState { idle, active, win, lose } [SerializeField]MiniGameState curGameState; [SerializeField]Spawner spawner; [SerializeField]Button startButton; //Button component on the StartButton gameObject [SerializeField]Text resultsText; //Text component on the ResultsText gameObject [SerializeField]CanvasGroup resultsPanelCG; //canvas group component on the ResultsPanel [SerializeField]int winScore =30;// Start is called before the first frame updatevoidStart() { curGameState =MiniGameState.idle;Utility.ShowCG(resultsPanelCG); //make sure panel is visibleresultsText.text="Score "+ winScore +" To Win";startButton.onClick.AddListener(ReStartGame); }// Update is called once per framevoidUpdate() {if (curGameState ==MiniGameState.active) {if (GameData.instanceRef.Health>0) {if (GameData.instanceRef.Score>= winScore) {//won the game curGameState =MiniGameState.win;resultsText.text="You are a winner";GameOver(); } }else//lost due to health { curGameState =MiniGameState.lose;resultsText.text="You lost, so sorry, try again";GameOver(); } } //end if } //end Update/// <summary>/// Restart the game/// </summary>/// Syntax for a method to be executed by a Unity Event/// MUST BE PUBLIC to be executed by Unity EVENTpublicvoidReStartGame() //important syntax {GameData.instanceRef.ResetGameData(); //use singleton variable to call public methodUtility.HideCG(resultsPanelCG); //toggle to hide panel curGameState =MiniGameState.active;startButton.gameObject.SetActive( false );//start spawnerspawner.activeSpawning=true;spawner.StartSpawning(); }/// <summary>/// Games the over./// Private since only executed from within this class/// </summary>privatevoidGameOver() {Utility.ShowCG(resultsPanelCG); //toggle to make visible///TODO stop spawner, destroy all spawned objectsspawner.StopAllSpawning();startButton.gameObject.SetActive( true );/// Get Text that is the child of the StartButton Text btnText =startButton.GetComponentInChildren<Text>();btnText.text="Play Again"; }}//end class