I followed a Unity Events tutorial and adapted it to my game link: Unity How to structure your code with UnityEvents - Tutorial - YouTube
I have 1 script called GameLogicScript, 1 script called UIScript and 1 script for the events called Events
When I invoke an event from the UIScript, the GameLogicScript detects it and does accordingly how it is supposed to do, however, when I try to do it the other way (GameLogicScript invokes and event and UIScript detects it is not working)
This is my relevant code:
--------------- UIScript ---------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIScript : MonoBehaviour
{
public GameObject pauseMenuUI;
public GameObject gameOverMenuUI;
public GameObject mainMenuUI;
public GameObject gameplayUI;
//Play - pause button
public Button pauseResumeButton;
public Sprite pauseSprite;
public Sprite playSprite;
//Score
public Text scoreText;
private int score;
void Start()
{
//Listen to events
Events.gameOver.AddListener(GameOver);
Events.increaseScore.AddListener(IncreaseScore);
Events.playAgainUI.AddListener(PlayAgain);
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.Escape)){
ResumeOrPause();
}
}
public void PlayAgain(){
Debug.Log("Holiwis");
pauseMenuUI.SetActive(false);
gameOverMenuUI.SetActive(false);
mainMenuUI.SetActive(false);
gameplayUI.SetActive(true);
}
public void PlayAgainForButton(){
Events.playAgainGameLogic.Invoke();
}
}
--------------- GameLogicScript ---------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameLogicScript : MonoBehaviour
{
//Cameras
public GameObject menuCamera;
public GameObject gameplayCamera;
//Bool
public static bool isPlaying = false;
public static bool playAgain = false;
//Float
private float InstantiateToppingY;
//GameObject
private GameObject NextTopping;
public GameObject NewToppingPrefab;
//Others
public Sprite[] ToppingSprites;
void Start(){
InstantiateToppingY = -2;
//Listen to events
Events.instantiateTopping.AddListener(InstantiateTopping);
Events.resume.AddListener(Resume);
Events.pause.AddListener(Pause);
Events.mainMenu.AddListener(LoadMenu);
Events.startGame.AddListener(StartGame);
Events.playAgainGameLogic.AddListener(PlayAgain);
if(playAgain){
Debug.Log("Invoked event");
Events.playAgainUI.Invoke();
StartGame();
}
else
Pause();
}
public void PlayAgain(){
playAgain = true;
SceneManager.LoadScene("Main");
}
}
--------------- Events ---------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public static class Events
{
public static UnityEvent gameOver = new UnityEvent();
public static UnityEvent instantiateTopping = new UnityEvent();
public static UnityEvent increaseScore = new UnityEvent();
public static UnityEvent resume = new UnityEvent();
public static UnityEvent pause = new UnityEvent();
public static UnityEvent mainMenu = new UnityEvent();
public static UnityEvent startGame = new UnityEvent();
public static UnityEvent playAgainGameLogic = new UnityEvent();
public static UnityEvent playAgainUI = new UnityEvent();
}