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;
///
/// Singleton instance of QuickAccess. No longer creates an instance if one doesn't exist.
///
public static QuickAccess Instance => _instance;
#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()
{
_instance = this;
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
}
}