73 lines
2.6 KiB
C#
73 lines
2.6 KiB
C#
using System.Collections;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
using UnityEngine.SceneManagement;
|
||
|
||
namespace Cielonos.Core.SceneManagement
|
||
{
|
||
public class LoadingSceneManager : MonoBehaviour
|
||
{
|
||
[Header("UI References")]
|
||
[SerializeField] private TMP_Text progressText;
|
||
|
||
[Header("Settings")]
|
||
[SerializeField] private float minimumLoadTime = 1.0f; // 防止加载太快闪屏,强制显示至少1秒
|
||
|
||
private void Start()
|
||
{
|
||
// 获取目标场景
|
||
string targetScene = SceneBus.TargetSceneName;
|
||
|
||
if (string.IsNullOrEmpty(targetScene))
|
||
{
|
||
Debug.LogError("LoadingController: Target scene is null! Returning to Menu.");
|
||
// 这里可以做一个回滚逻辑,比如回 Menu
|
||
return;
|
||
}
|
||
|
||
StartCoroutine(LoadSceneAsync(targetScene));
|
||
}
|
||
|
||
private IEnumerator LoadSceneAsync(string sceneName)
|
||
{
|
||
// 开始异步加载目标场景
|
||
// 注意:这里是 LoadSceneMode.Single,因为是从 Menu 切到 MainGame,需要彻底销毁 Menu
|
||
AsyncOperation op = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Single);
|
||
|
||
// 阻止自动跳转,为了我们可以控制进度条到 100% 再跳转
|
||
op.allowSceneActivation = false;
|
||
|
||
float timer = 0f;
|
||
|
||
while (!op.isDone)
|
||
{
|
||
timer += Time.deltaTime;
|
||
|
||
// op.progress 在 allowSceneActivation = false 时最大只能到 0.9
|
||
float progress = Mathf.Clamp01(op.progress / 0.9f);
|
||
|
||
// 只有当加载进度到了 0.9 且 满足了最小等待时间,才允许完成
|
||
if (progress >= 1f && timer >= minimumLoadTime)
|
||
{
|
||
// 可以在这里做一个 "Press Any Key to Continue" 的逻辑,或者直接跳转
|
||
UpdateUI(1f);
|
||
op.allowSceneActivation = true;
|
||
}
|
||
else
|
||
{
|
||
// 为了视觉平滑,我们可以取 真实进度 和 模拟时间进度 的较小值
|
||
// 或者简单粗暴直接显示 progress
|
||
UpdateUI(progress);
|
||
}
|
||
|
||
yield return null;
|
||
}
|
||
}
|
||
|
||
private void UpdateUI(float progress)
|
||
{
|
||
//if (_progressBar != null) _progressBar.value = progress;
|
||
if (progressText != null) progressText.text = $"Loading... {(progress * 100):F0}%";
|
||
}
|
||
}
|
||
} |