using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Cysharp.Threading.Tasks; /// /// 启动加载窗口 /// public class LaunchLoadingWin : MonoBehaviour { // 单例实例 private static LaunchLoadingWin _instance; public static LaunchLoadingWin Instance { get { if (_instance == null) { Debug.Log("LaunchLoadingWin 界面未打开"); return null; } return _instance; } } // UI组件引用 [SerializeField] public Text titleText; [SerializeField] public Text tipsText; [SerializeField] public Image progressBar; [SerializeField] public Text progressText; // 提示文本列表 [SerializeField] private List tipsList = new List(); // 当前提示索引 private int currentTipIndex = 0; // 是否正在显示 // 计时器 private float tipChangeTimer = 0f; private const float TIP_CHANGE_INTERVAL = 3f; // 提示切换间隔时间 private void Awake() { _instance = this; // 初始化提示列表 InitTipsList(); // 初始化进度条 SetProgress(0f); } /// /// 初始化提示列表 /// private void InitTipsList() { tipsList.Clear(); tipsList.Add(FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.LoadingResources)); tipsList.Add(FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.CheckingVersionUpdate)); tipsList.Add(FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.InitializingGame)); tipsList.Add(FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.EnteringGameWorld)); } /// /// 打开窗口 /// public static void OpenWindow() { if (null != _instance) { DestroyImmediate(_instance.gameObject); _instance = null; } _instance = GameObject.Instantiate(Resources.Load("LaunchLoadingWin")).GetComponent(); _instance.gameObject.SetActive(true); } /// /// 关闭窗口 /// public void CloseWindow() { // 隐藏窗口而不是销毁 DestroyImmediate(gameObject); _instance = null; Debug.Log("关闭加载窗口"); } /// /// 设置进度 /// /// 进度值(0-1) public void SetProgress(float progress) { // 限制进度值范围 progress = Mathf.Clamp01(progress); // 更新进度条 if (progressBar != null) { progressBar.fillAmount = progress; } // 更新进度文本 if (progressText != null) { progressText.text = $"{(int)(progress * 100)}%"; } } /// /// 设置提示文本 /// /// 提示文本 public void SetTip(string tip) { if (tipsText != null) { tipsText.text = tip; } } /// /// 异步显示加载进度 /// /// 加载持续时间 /// 目标进度 public async UniTask ShowProgressAsync(float duration, float targetProgress = 1.0f) { float startProgress = progressBar != null ? progressBar.fillAmount : 0f; float currentProgress = startProgress; float elapsedTime = 0f; while (elapsedTime < duration) { elapsedTime += Time.deltaTime; currentProgress = Mathf.Lerp(startProgress, targetProgress, elapsedTime / duration); SetProgress(currentProgress); await UniTask.Yield(); } // 确保最终进度正确 SetProgress(targetProgress); } /// /// 当前状态索引 /// private int currentStateIndex = -1; /// /// 设置当前状态 /// /// 状态索引 public void SetCurrentState(int stateIndex) { currentStateIndex = stateIndex; // 根据状态索引更新提示文本 UpdateTipsByState(); } /// /// 根据当前状态更新提示文本 /// private void UpdateTipsByState() { string tip = ""; // 根据状态索引设置对应的提示文本 switch (currentStateIndex) { case FirstPackLang.TextIndex.InitSDK: tip = FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.InitializingSDK); break; case FirstPackLang.TextIndex.ExtractResources: tip = FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.CheckingResources); break; case FirstPackLang.TextIndex.CheckVersion: tip = FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.CheckingVersion); break; case FirstPackLang.TextIndex.HotUpdate: tip = FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.PrepareUpdate); break; case FirstPackLang.TextIndex.EnterHotUpdateAssembly: tip = FirstPackLang.Instance.GetText(FirstPackLang.TextIndex.EnteringGame); break; } // 设置提示文本 if (!string.IsNullOrEmpty(tip)) { SetTip(tip); } } }