using UnityEngine; using WI; using UnityEngine.UI; using System.Collections; using TMPro; using System; namespace Samkwang { public class Panel_Loading : MonoBehaviour { public CanvasGroup logoRoot; public Image arcImage; public GameObject loadingBarRoot; public Slider slider_LoadingProgress; public TMP_Text Text_Loading; public float fadeOutDuration = 0.8f; public float simulationDuration = 4f; private static bool hasPlayedOnce = false; Coroutine loadingCoroutine; public Action onLoadingComplete; void Awake() { logoRoot = transform.GetComponentInChildren(); arcImage = logoRoot.GetComponentInChildren(); loadingBarRoot = transform.Find("LoadingBar").gameObject; slider_LoadingProgress = loadingBarRoot.GetComponentInChildren(); Text_Loading = loadingBarRoot.GetComponentInChildren(); transform.SetAsLastSibling(); logoRoot.alpha = 1f; arcImage.fillAmount = 0f; } void Start() { if (hasPlayedOnce) { gameObject.SetActive(false); return; } hasPlayedOnce = true; StartLoadingRoutine(); } public void StartLoadingRoutine() { if (loadingCoroutine != null) StopCoroutine(loadingCoroutine); loadingCoroutine = StartCoroutine(RunLoadingRoutine()); } IEnumerator RunLoadingRoutine() { yield return new WaitForSeconds(0.3f); float elapsed = 0f; while (elapsed < simulationDuration) { elapsed += Time.deltaTime; float progress = Mathf.Clamp01(elapsed / simulationDuration); UpdateProgress(progress); RotateArc(); yield return null; } UpdateProgress(1f); arcImage.fillAmount = 1f; loadingBarRoot.SetActive(false); yield return new WaitForSeconds(0.2f); yield return StartCoroutine(FadeOutAndDisable()); } void UpdateProgress(float progress01) { slider_LoadingProgress.value = progress01; Text_Loading.SetText($"Loading..({(progress01 * 100f).ToString("F0")}%)"); } void RotateArc() { arcImage.fillAmount = arcImage.fillAmount < 1 ? arcImage.fillAmount += Time.deltaTime * 0.5f : 0; } IEnumerator FadeOutAndDisable() { float t = 0f; float start = logoRoot.alpha; while (t < fadeOutDuration) { t += Time.deltaTime; logoRoot.alpha = Mathf.Lerp(start, 0f, t / fadeOutDuration); yield return null; } logoRoot.alpha = 0f; gameObject.SetActive(false); onLoadingComplete?.Invoke(); } } }