using System.Collections; using Logging; using TMPro; using UnityEngine; namespace Base { public class Launcher : MonoBehaviour { public GameObject loadingUI; public Gradient progressBar; // 渐变色条 public TMP_Text describeText; // 描述文本 public float duration = 0.5f; // 过渡时间 public float fadeDuration = 2f; // 不透明度渐隐的时间 private float _currentProgress = 0f; // 当前进度 private Color textColor; private readonly string[] _loadingSteps = { "初始化日志", "正在载入定义", "正在加载图片资源", "正在切割瓦片", "正在加载区分派系", "正在加载物品" }; public float Progress { set { _currentProgress = value; if (value < 0.5f) { progressBar.color2 = Color.Lerp(Color.black, Color.white, value * 2); } else { progressBar.color2 = Color.white; progressBar.color1 = Color.Lerp(Color.black, Color.white, (value - 0.5f) * 2); } progressBar.Refresh(); } } public float Opacity { set { var alpha = (byte)(value * 255); progressBar.color1.a = alpha; progressBar.color2.a = alpha; describeText.color = value > 0.5f ? Color.Lerp(new Color(1, 1, 1, 0), textColor, (value - 0.5f) * 2) : new Color(1, 1, 1, 0); progressBar.Refresh(); } } private void Start() { Base.Setting.Instance.Init(); #if !DEBUG duration = Base.Setting.Instance.progressStepDuration; fadeDuration = Base.Setting.Instance.exitAnimationDuration; #endif loadingUI.SetActive(true); textColor = describeText.color; StartCoroutine(LoadAllManagers()); } private IEnumerator LoadAllManagers() { for (var i = 0; i < _loadingSteps.Length; i++) { // 更新描述文本 describeText.text = _loadingSteps[i]; // 获取当前阶段的目标进度 var targetProgress = (float)(i + 1) / _loadingSteps.Length; // 平滑过渡到下一个阶段 yield return SmoothTransitionTo(targetProgress); // 初始化对应的管理器 switch (i) { case 0: UnityLogger.Init(); break; case 1: Managers.DefineManager.Instance.Init(); break; case 2: Managers.PackagesImageManager.Instance.Init(); break; case 3: Managers.TileManager.Instance.Init(); break; case 4: Managers.AffiliationManager.Instance.Init(); break; case 5: Managers.ItemResourceManager.Instance.Init(); break; } } // 加载完成后的处理 describeText.text = "加载完成!"; Progress = 1f; // 开始渐隐效果 yield return FadeOutProgressBar(); } private IEnumerator SmoothTransitionTo(float targetProgress) { var startProgress = _currentProgress; var elapsedTime = 0f; while (elapsedTime < duration) { elapsedTime += Time.deltaTime; var t = Mathf.SmoothStep(0f, 1f, elapsedTime / duration); // 使用 SmoothStep 实现平滑过渡 Progress = Mathf.Lerp(startProgress, targetProgress, t); yield return null; } // 确保最终进度达到目标值 Progress = targetProgress; } private IEnumerator FadeOutProgressBar() { var elapsedTime = 0f; while (elapsedTime < fadeDuration) { elapsedTime += Time.deltaTime; var t = Mathf.SmoothStep(0f, 1f, elapsedTime / fadeDuration); // 使用 SmoothStep 实现平滑渐隐 Opacity = 1f - t; // 不透明度从 1 到 0 yield return null; } // 确保最终不透明度为 0 Opacity = 0f; loadingUI.SetActive(false); } } }