using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace OctoCore { /// /// Main entry point for the OctoCore framework. /// Manages all modules and coordinates their lifecycle. /// [DefaultExecutionOrder(-100)] public class OctoCore : MonoBehaviour { /// /// Singleton instance of OctoCore. /// public static OctoCore Instance { get; private set; } private List _modules = new(); /// /// Global settings for the OctoCore framework. /// public OctoSettings Settings; [SerializeField] private Platform.OctoPlatform _platform = new(); [SerializeField] private Save.OctoSave _save = new(); [SerializeField] private Inputs.OctoInputs _inputs = new(); [SerializeField] private Localization.OctoLocalization _localization = new(); [SerializeField] private UI.OctoUI _ui = new(); [SerializeField] private Navigation.OctoNavigation _navigation = new(); [SerializeField] private Development.OctoDevelopment _development = new(); /// /// Platform detection module. /// public Platform.OctoPlatform Platform => _platform; /// /// Save system module. /// public Save.OctoSave Save => _save; /// /// Input management module. /// public Inputs.OctoInputs Inputs => _inputs; /// /// Localization module for text and audio. /// public Localization.OctoLocalization Localization => _localization; /// /// UI management module. /// public UI.OctoUI UI => _ui; /// /// Scenes management module. /// public Navigation.OctoNavigation Navigation => _navigation; /// /// Development and debugging module. /// public Development.OctoDevelopment Development => _development; void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); return; } RegisterModule(_platform); RegisterModule(_save); RegisterModule(_inputs); RegisterModule(_localization); RegisterModule(_ui); RegisterModule(_navigation); RegisterModule(_development); foreach (IOctoModule module in _modules) { module.Init(Settings); } QualitySettings.vSyncCount = Settings.Application.VSyncCount; Application.targetFrameRate = Settings.Application.TargetFrameRate; } void RegisterModule(IOctoModule module) { _modules.Add(module); } void OnEnable() { SceneManager.activeSceneChanged += OnSceneChanged; } void OnDisable() { SceneManager.activeSceneChanged -= OnSceneChanged; } void Update() { foreach (IOctoModule module in _modules) { module.Tick(); } } void OnApplicationQuit() { foreach (IOctoModule module in _modules) { module.OnQuit(); } } void OnSceneChanged(Scene oldScene, Scene newScene) { foreach (IOctoModule module in _modules) { module.OnSceneChanged(oldScene, newScene); } } } }