using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; namespace BlueWater.Maps { public abstract class MapController : MonoBehaviour { /// 컴포넌트 [Title("컴포넌트")] [SerializeField, Required] protected Transform PlayerSpawnLocation; [field: SerializeField, Required] public Transform EnemyInstanceLocation { get; private set; } [field: SerializeField] public Transform ParticleInstanceLocation { get; private set; } [SerializeField] protected Transform MapEntranceLocations; [SerializeField] protected List MapEntrances; [SerializeField] protected SaveStage SaveStage; [SerializeField] protected string BgmName; [SerializeField] protected Vector2 InitializeFadeInOutTime = new(0.2f, 1f); [SerializeField] protected Vector2 ClearFadeInOutTime = new(0.2f, 0.3f); protected Coroutine MapInitializeCoroutineInstance; protected static bool IsCleared; private bool _isQuitting; private void Awake() { InitializeComponents(); } protected virtual void Start() { } protected virtual void OnApplicationQuit() { _isQuitting = true; } protected virtual void OnDestroy() { if (_isQuitting) return; } [Button("컴포넌트 초기화")] protected virtual void InitializeComponents() { PlayerSpawnLocation = transform.Find("Spawns/PlayerSpawn"); EnemyInstanceLocation = transform.Find("Enemies"); ParticleInstanceLocation = transform.Find("InstantiateObjects"); MapEntranceLocations = transform.Find("MapEntrances"); var entrancesArray = MapEntranceLocations.GetComponentsInChildren(); MapEntrances = new List(entrancesArray.Length); MapEntrances.AddRange(entrancesArray); } public abstract void InitializeMap(); public void OpenMapEntrances() { foreach (var element in MapEntrances) { element.OpenMapEntrance(); } } public void CloseMapEntrances() { foreach (var element in MapEntrances) { element.CloseMapEntrance(); } } public void DestroyAllEnemies() { foreach (Transform element in EnemyInstanceLocation) { Destroy(element.gameObject); } } public void DestroyAllObjects() { DestroyAllEnemies(); foreach (Transform element in ParticleInstanceLocation) { Destroy(element.gameObject); } } public void MovePlayer() { if (!GameManager.Instance.CurrentCombatPlayer) return; GameManager.Instance.CurrentCombatPlayer.transform.position = PlayerSpawnLocation.position; } public abstract void ResetMap(bool isHardReset = false); public abstract void RestartMap(); public abstract void ClearMap(); } }