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);
}
}
}