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);
}
}
}
}