using System; using System.Collections; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.UI; // ReSharper disable once CheckNamespace namespace BlueWaterProject { 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 SkillUi MainSkillUi { get; private set; } [field: SerializeField] public FieldBossHpSlider FieldBossHpSlider { get; private set; } [field: SerializeField] public HeartHpUi HeartHpUi { get; private set; } [field: SerializeField] public DropItemGroupController DropItemGroupController { 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 CombatMenuPopupUi CombatMenuPopupUi { get; private set; } [Title("효과")] [SerializeField] private Image fadeUi; [SerializeField] private Vector2 fadeDuration = new(0.2f, 0.3f); private List popupUiList; protected override void OnAwake() { Init(); } private void OnEnable() { PopupUi.OnPopupUiOpenEvent += RegisterPopup; PopupUi.OnPopupUiCloseEvent += UnregisterPopup; } private void OnDisable() { PopupUi.OnPopupUiOpenEvent -= RegisterPopup; PopupUi.OnPopupUiCloseEvent -= UnregisterPopup; } [Button("셋팅 초기화")] private void Init() { MainCanvas = GetComponent(); if (!MainCanvas) { Debug.LogError("canvas is null error"); return; } WorldSpaceCanvas = GameObject.Find("WorldSpaceCanvas").GetComponent(); MainSkillUi = MainCanvas.transform.Find("MainSkillUi").GetComponent(); FieldBossHpSlider = MainCanvas.transform.Find("FieldBossHpSlider").GetComponent(); HeartHpUi = MainCanvas.transform.Find("HeartHpUi").GetComponent(); DropItemGroupController = MainCanvas.transform.Find("DropItemGroup").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(); fadeUi = MainCanvas.transform.Find("FadeUi").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() { StartCoroutine(nameof(FadeInOutCoroutine)); } private IEnumerator FadeInOutCoroutine() { fadeUi.enabled = true; // 페이드 인 var elapsedTime = 0f; while (elapsedTime < fadeDuration.x) { elapsedTime += Time.deltaTime; var alpha = Mathf.Lerp(0f, 1f, elapsedTime / fadeDuration.x); fadeUi.color = new Color(fadeUi.color.r, fadeUi.color.g, fadeUi.color.b, alpha); yield return null; } fadeUi.color = new Color(fadeUi.color.r, fadeUi.color.g, fadeUi.color.b, 1f); // 페이드 아웃 elapsedTime = 0f; while (elapsedTime < fadeDuration.y) { elapsedTime += Time.deltaTime; var alpha = Mathf.Lerp(1f, 0f, elapsedTime / fadeDuration.y); fadeUi.color = new Color(fadeUi.color.r, fadeUi.color.g, fadeUi.color.b, alpha); yield return null; } fadeUi.color = new Color(fadeUi.color.r, fadeUi.color.g, fadeUi.color.b, 0f); fadeUi.enabled = false; } public void RestartCurrentStage() { switch (DataManager.Inst.CurrentSaveStage) { case SaveStage.TUTORIAL: break; case SaveStage.SLIME: FindAnyObjectByType()?.InitBossMap(); break; case SaveStage.RHINOCEROS: FindAnyObjectByType()?.InitBossMap(); break; default: throw new ArgumentOutOfRangeException(); } CloseAllPopup(); } public void MoveNextStage() { DataManager.Inst.CurrentSaveStage++; RestartCurrentStage(); } public void MoveSelectStage(int stage) { DataManager.Inst.CurrentSaveStage = (SaveStage)stage; RestartCurrentStage(); } public void QuitGame() { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false; #else Application.Quit(); #endif } } }