using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
///
/// singleton for a single source of truth game state and flow management
///
public class GameManager : MonoBehaviour
{
///
/// singleton pattern: define instance field for accessing the singleton elsewhere
///
public static GameManager Instance;
///
/// ui manager object for handling ui state and flow
///
public UIManager ui;
///
/// the local player data object for storing player data
///
private LocalPlayerData _data;
///
/// read-only property for accessing the local player data outside of this class
///
public LocalPlayerData Data => _data;
///
/// list of callbacks to call when the local player data changes
///
private readonly List> _onLocalPlayerDataChangeCallbacks = new List>();
///
/// backend object for handling communication with the firebase backend
///
public Backend Backend;
///
/// enforces singleton behaviour; sets doesn't destroy on load and checks for multiple instances
///
private void Awake()
{
// check if instance hasn't been set yet
if (Instance == null)
{
Debug.Log("awake as singleton instance, setting self as the forever-alive instance");
Instance = this;
DontDestroyOnLoad(gameObject);
}
// check if instance is already set and it's not this instance
else if (Instance != null && Instance != this)
{
Debug.Log("awake as non-singleton instance, destroying self");
Destroy(gameObject);
}
}
///
/// called when the game object is enabled, initialises variables
///
private void OnEnable()
{
ui = UIManager.Instance;
// load the local player data and refresh the ui
_data = new LocalPlayerData();
Backend = new Backend();
Backend.Initialise(status =>
{
Debug.Log("initialised backend, setting connection status text");
ui.UI.Q