Which is the best approach to call a function. Lets take an example of a car game.
Singleton class
GameManager is a singleton class and I have one more class called PlayerCar.
public class GameManager : MonoBehaviour {
private static GameManager _instance;
public CameraManager camera;
public SoundManager sound;
public UIManager ui;
public static GameManager instance{
get{
if(_instance == null){
_instance = GameObject.FindObjectOfType<GameManager>();
}
return _instance;
}
}
public void CarDamage(){
camera.Shake();
sound.PlayDamage();
ui.ShowDamageText();
}
}
public class PlayerCar{
private void OnDamageRecieved(){
GameManager.instance.CarDamage();
}
}
Now whenever playercar recieves damage OnDamageRecieved is called which in turn calls Gamemanagers CarDamage function.
Now let’s us take another method which is delegate and events
public class PlayerCar{
public delegate void Damage();
public static event Damage ShakeCamera;
public static event Damage PlayDamageSound;
public static event Damage ShowDamageText;
private void OnDamageRecieved(){
ShakeCamera();
PlayDamageSound();
ShowDamageText();
}
}
public class CameraManager : MonoBehaviour{
void OnEnable(){
PlayerCar.ShakeCamera += Shake;
}
void OnDisable(){
PlayerCar.ShakeCamera -= Shake;
}
private void Shake(){}
}
public class SoundManager : MonoBehaviour{
void OnEnable(){
PlayerCar.PlayDamageSound += PlayDamage;
}
void OnDisable(){
PlayerCar.PlayDamageSound -= PlayDamage;
}
private void PlayDamage(){}
}
public class UIManager : MonoBehaviour{
void OnEnable(){
PlayerCar.ShowDamageText += ShowDamageText;
}
void OnDisable(){
PlayerCar.ShowDamageText -= ShowDamageText;
}
private void ShowDamageText(){}
}
So which is the best approach of calling a function which is in some other class.