By implementing the singleton pattern for GameManager
, we can easily access it from anywhere using one single point of access. I guess you will feel really confused about this now. A simple example will help you get your head around it.
"In software engineering, the singleton pattern is a design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system."
- Wikipedia
Let's add the following code to the GameManager
class. Declare a new public static variable. This code should be written right next to other public variables:
public static GameManager instance;
Then, add an Awake
method with the following line.
void Awake() { instance = this; }
That's it! This is all the code you need for a simple access to the GameManager
instance from anywhere in your code. It is important to remember that only one instance of this component can be present in the whole Unity Scene. To access any of the public code in GameManager
from another class, you can simply call:
GameManager.instance.SomeUsefulMethodOrVariable
For example, if we want to read the currentGameState
value from PlayerController
, we will simply write:
GameState currentState = GameManager.instance.currentGameState;
I hope the singleton pattern is fairly familiar to you now. Of course, we just covered the basics. Feel free to browse the Internet and read more about the subject.
We have easy access to
GameManager
, with basic game events helping to control the game. When we press Play in Unity, we can still see that our character is running forward without any control. We are unable to stop him at all. Let's put some restrictions in PlayerController
so that the running and jumping behavior works only when currentGameState
is .inGame
. To do this, let's open PlayerController
and add some code:
Lines 22 and 34 are identical. They contain a simple if
statement to make the running and jumping functionality work only when currentGameState
is
inGame
. There isn't much more to explain here. Notice how easily we can access the currentGameState
due to the singleton approach.