using UnityEngine; using AppleHills.Data.CardSystem; using Cinematics; using Core; using Data.CardSystem; using Input; using PuzzleS; namespace AppleHills.Core { /// /// Provides quick access to frequently used game objects, components, and manager instances. /// References are cached for performance and automatically invalidated on scene changes. /// public class QuickAccess : MonoBehaviour { #region Singleton Setup private static QuickAccess _instance; private static bool _isQuitting = false; public static QuickAccess Instance { get { if (_instance == null && Application.isPlaying && !_isQuitting) { _instance = FindAnyObjectByType(); if (_instance == null) { var go = new GameObject("QuickAccess"); _instance = go.AddComponent(); } } return _instance; } } void OnApplicationQuit() { _isQuitting = true; } #endregion Singleton Setup #region Manager Instances // Core Managers public GameManager GameManager => GameManager.Instance; public ItemManager ItemManager => ItemManager.Instance; public SceneManagerService SceneManager => SceneManagerService.Instance; // Other Managers public InputManager InputManager => InputManager.Instance; public PuzzleManager PuzzleManager => PuzzleManager.Instance; public CinematicsManager CinematicsManager => CinematicsManager.Instance; public CardSystemManager CardSystemManager => CardSystemManager.Instance; #endregion #region Player and Follower References private GameObject _playerGameObject; private GameObject _followerGameObject; private PlayerTouchController _playerController; private FollowerController _followerController; private Camera _mainCamera; private bool _initialized = false; /// /// Returns the player GameObject. Finds it if not already cached. /// public GameObject PlayerGameObject { get { if (_playerGameObject == null) { _playerGameObject = GameObject.FindGameObjectWithTag("Player"); } return _playerGameObject; } } /// /// Returns the follower (Pulver) GameObject. Finds it if not already cached. /// public GameObject FollowerGameObject { get { if (_followerGameObject == null) { _followerGameObject = GameObject.FindGameObjectWithTag("Pulver"); } return _followerGameObject; } } /// /// Returns the player controller component. Finds it if not already cached. /// public PlayerTouchController PlayerController { get { if (_playerController == null && PlayerGameObject != null) { _playerController = PlayerGameObject.GetComponent(); } return _playerController; } } /// /// Returns the follower controller component. Finds it if not already cached. /// public FollowerController FollowerController { get { if (_followerController == null && FollowerGameObject != null) { _followerController = FollowerGameObject.GetComponent(); } return _followerController; } } /// /// Returns the main camera. Caches for performance. /// public Camera MainCamera { get { if (_mainCamera == null) { _mainCamera = Camera.main; } return _mainCamera; } } #endregion #region Initialization and Scene Management private void Awake() { if (!_initialized) { // Subscribe to scene changes if (SceneManager != null) { SceneManager.SceneLoadCompleted += OnSceneLoadCompleted; } _initialized = true; } } /// /// Handle scene changes by clearing cached references. /// private void OnSceneLoadCompleted(string sceneName) { ClearReferences(); } /// /// Clear all cached references. /// public void ClearReferences() { _playerGameObject = null; _followerGameObject = null; _playerController = null; _followerController = null; _mainCamera = null; } #endregion } }