using System; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; namespace Core { public abstract class EntryPoint : BaseMonoBehaviour { [SerializeField] [Required] private Transform panelsHolder; [SerializeField] [Required] private Transform systemsHolder; private Dictionary _panels; private Dictionary _systems; private HashSet _tickSystems; protected override void ReleaseReferences() { panelsHolder = null; systemsHolder = null; } public void Initialize() { _systems = new Dictionary(); _panels = new Dictionary(); _tickSystems = new HashSet(); PermanentController.Initialize(); foreach (Transform trSystem in systemsHolder) { var system = trSystem.gameObject.GetComponent(); if (system == null) { Debug.LogWarning($"{trSystem.gameObject.name} must inherit from SystemBase"); continue; } _systems.Add(system.GetType(), system); system.Initialize(); if (system is ITick tick) _tickSystems.Add(tick); } foreach (Transform trPanel in panelsHolder) { var panel = trPanel.gameObject.GetComponent(); if (panel == null) { Debug.LogWarning($"{trPanel.gameObject.name} must inherit from PanelBase"); continue; } _panels.Add(panel.GetType(), panel); panel.Initialize(); // Should be moved along with starting systems? // Or switch system initialization prior to panels? if (panel.AutoEnable) { panel.OpenPanelImmediately(); continue; } panel.ClosePanelImmediately(); } } public void Tick() { PermanentController.Tick(); foreach (var system in _tickSystems) system?.Tick(); } public void StartControllers() { PermanentController.StartControllers(); foreach (var system in _systems.Values) if (system.AutoStart) system.StartSystem(); } public void OpenDefaultPanels() { foreach (var panel in _panels.Values) if (panel.AutoEnable) panel.OpenPanelImmediately(); } public virtual void Execute() {} private bool HasSystem() where T : SystemBase => _systems.ContainsKey(typeof(T)); private bool HasPanel() where T : PanelBase => _panels.ContainsKey(typeof(T)); public T GetSystem() where T : SystemBase { if (HasSystem()) return (T) _systems[typeof(T)]; return PermanentController.GetSystem(); } public T GetPanel() where T : PanelBase { if (!HasPanel()) return null; return (T) _panels[typeof(T)]; } } }