using System; using System.Collections.Generic; using BlueWater.Items; using BlueWater.Maps; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace BlueWater.Uis { public class CombatUiManager : Singleton { [field: Title("UI")] [field: SerializeField] public Canvas MainCanvas { get; private set; } [field: SerializeField] public Canvas WorldSpaceCanvas { get; private set; } [field: SerializeField] public CombatSkillUi CombatSkillUi { get; private set; } [field: SerializeField] public FieldBossHealthPointUi FieldBossHealthPointUi { get; private set; } [field: SerializeField] public PlayerHealthPointUi PlayerHealthPointUi { get; private set; } [field: SerializeField] public ItemLootUi ItemLootUi { get; private set; } [field: SerializeField] public CombatItemInventoryUi CombatItemInventoryUi { get; private set; } [field: SerializeField] public GameOverPopupUi GameOverPopupUi { get; private set; } [field: SerializeField] public ClearPopupUi ClearPopupUi { get; private set; } [field: SerializeField] public MenuPopupUi CombatMenuPopupUi { get; private set; } [field: SerializeField] public CombatTutorialUi CombatTutorialUi { get; private set; } [SerializeField] private Image _fadeImage; [Title("효과")] [SerializeField] private Vector2 _fadeInOutDuration = new(0.2f, 0.3f); private List _popupUiList; protected override void OnAwake() { Init(); } private void OnEnable() { PopupUi.OnPopupUiOpenEvent += RegisterPopup; PopupUi.OnPopupUiCloseEvent += UnregisterPopup; } private void Start() { CombatTutorialUi.ShowFirstTutorialUi(); } private void OnDisable() { PopupUi.OnPopupUiOpenEvent -= RegisterPopup; PopupUi.OnPopupUiCloseEvent -= UnregisterPopup; } [Button("셋팅 초기화")] private void Init() { MainCanvas = GetComponent(); WorldSpaceCanvas = GameObject.Find("WorldSpaceCanvas").GetComponent(); CombatSkillUi = MainCanvas.transform.Find("CombatSkillUi").GetComponent(); FieldBossHealthPointUi = MainCanvas.transform.Find("FieldBossHealthPointUi").GetComponent(); PlayerHealthPointUi = MainCanvas.transform.Find("PlayerHealthPointUi").GetComponent(); ItemLootUi = MainCanvas.transform.Find("ItemLootUi").GetComponent(); CombatItemInventoryUi = MainCanvas.transform.Find("CombatItemInventoryUi").GetComponent(); GameOverPopupUi = MainCanvas.transform.Find("GameOverPopupUi").GetComponent(); ClearPopupUi = MainCanvas.transform.Find("ClearPopupUi").GetComponent(); CombatMenuPopupUi = MainCanvas.transform.Find("CombatMenuPopupUi").GetComponent(); CombatTutorialUi = MainCanvas.transform.Find("CombatTutorialUi").GetComponent(); _fadeImage = MainCanvas.transform.Find("FadeImage").GetComponent(); _popupUiList = new List(8); } private void RegisterPopup(PopupUi popup) { if (!_popupUiList.Contains(popup)) { _popupUiList.Add(popup); } } private void UnregisterPopup(PopupUi popup) { if (_popupUiList.Contains(popup)) { _popupUiList.Remove(popup); } } public void CloseLastPopup() { if (_popupUiList.Count <= 0) return; _popupUiList[^1].Close(); } public void CloseAllPopup() { var tempList = new List(_popupUiList); foreach (var popup in tempList) { popup.Close(); } _popupUiList.Clear(); } public bool IsPopupListEmpty() => _popupUiList.Count == 0; public void FadeInOut() { _fadeImage.enabled = true; _fadeImage.color = new Color(1, 1, 1, 0); _fadeImage.DOFade(1f, _fadeInOutDuration.x).OnComplete(() => { _fadeImage.DOFade(0f, _fadeInOutDuration.y).OnComplete(() => { _fadeImage.enabled = false; }); }); } public void RestartCurrentStage() { MapController MapController = null; // TODO : 세컨드 맵 추가 switch (DataManager.Instance.CurrentSaveStage) { case SaveStage.FirstTutorial: MapController = FindAnyObjectByType(); break; // case SaveStage.SecondTutorial: // MapController = FindAnyObjectByType(); // break; case SaveStage.Slime: MapController = FindAnyObjectByType(); break; case SaveStage.Rhinoceros: MapController = FindAnyObjectByType(); break; default: throw new ArgumentOutOfRangeException(); } if (MapController != null) { MapManager.Instance.InitMap(MapController); } CloseAllPopup(); } public void MoveNextStage() { DataManager.Instance.CurrentSaveStage++; RestartCurrentStage(); } public void MoveSelectStage(int stage) { DataManager.Instance.CurrentSaveStage = (SaveStage)stage; RestartCurrentStage(); } public void MoveTitleScene() { VisualFeedbackManager.Instance.SetBaseTimeScale(1f); SceneManager.LoadScene("00.CombatTitle"); } public void QuitGame() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } } }