using System; using System.Collections; using Settings; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.SceneManagement; namespace Core { public enum SceneList { MainLoading = 0, InGame = 1 } public class Application : BaseMonoBehaviour { private static Application _instance; public static AppParameters Parameters => _instance.parameters; public static GameConfiguration Configuration => _instance.configuration; [SerializeField] [Required] private AppParameters parameters; [SerializeField] [Required] private GameConfiguration configuration; [SerializeField] [Required] private EntryPoint sceneEntry; public bool AppStarted { get; private set; } protected override void ReleaseReferences() { _instance = null; } private void Awake() { if (_instance != null) return; _instance = this; } private void Start() { sceneEntry.Initialize(); StartApp(); } private void Update() { if (!AppStarted) return; sceneEntry.Tick(); } private void StartApp() { sceneEntry.StartControllers(); AppStarted = true; sceneEntry.Execute(); } public static T GetSystem() where T : SystemBase { if (_instance == null) return null; return _instance.sceneEntry.GetSystem(); } public static T GetPanel() where T : PanelBase { if (_instance == null) return null; return _instance.sceneEntry.GetPanel(); } public static void ExitApp() => UnityEngine.Application.Quit(); public static void LoadScene(SceneList inScene, Action onLoadComplete = null) { _instance.StartCoroutine(LoadSceneAsync(inScene, onLoadComplete)); /*SceneManager.sceneLoaded += OnSceneLoaded; SceneManager.LoadSceneAsync((int) inScene); return; void OnSceneLoaded(Scene scene, LoadSceneMode loadMode) => onLoadComplete?.Invoke();*/ } private static IEnumerator LoadSceneAsync(SceneList inScene, Action onLoadComplete = null) { var operation = SceneManager.LoadSceneAsync((int) inScene); while (!operation.isDone) yield return null; onLoadComplete?.Invoke(); } // TODO: Add tracking for previous/current scenes? // TODO: Add CommandSystem // TODO: Add progress tracking for scene loading? (Make it a command?) } }