1.首先是把你需要加载的场景拖到Scene InBuild里面,不然加载会报错。
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI; // 引入 UI 命名空间
public class GameManager : MonoBehaviour
{
// 单例模式
public static GameManager Instance { get; private set; }
[Header("UI Elements")]
public Slider progressBar; // 这里是用于显示进度条的 Slider
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this.gameObject);
}
else
{
Instance = this;
DontDestroyOnLoad(this.gameObject);
}
}
// 同步加载场景
public void LoadGameScene(string sceneName)
{
SceneManager.LoadScene(sceneName);
}
// 异步加载场景
public void LoadGameSceneAsync(string sceneName)
{
StartCoroutine(LoadSceneAsync(sceneName));
}
// 卸载场景
public void UnloadGameScene(string sceneName)
{
StartCoroutine(UnloadSceneAsync(sceneName));
}
// 协程:异步加载场景
private IEnumerator LoadSceneAsync(string sceneName)
{
if (progressBar != null)
{
progressBar.gameObject.SetActive(true); // 显示进度条
}
AsyncOperation asyncOperation = SceneManager.LoadSceneAsync(sceneName);
asyncOperation.allowSceneActivation = false; // 防止场景自动激活
while (!asyncOperation.isDone)
{
// 更新进度条
if (progressBar != null)
{
progressBar.value = asyncOperation.progress / 0.9f; // 进度条的最大值是 1.0, 但 `progress` 最大值是 0.9
}
if (asyncOperation.progress >= 0.9f)
{
// 场景加载完成
if (progressBar != null)
{
progressBar.value = 1f; // 设置进度条为 100%
}
asyncOperation.allowSceneActivation = true; // 允许场景激活
}
yield return null;
}
if (progressBar != null)
{
progressBar.gameObject.SetActive(false); // 隐藏进度条
}
}
// 协程:异步卸载场景
private IEnumerator UnloadSceneAsync(string sceneName)
{
AsyncOperation asyncOperation = SceneManager.UnloadSceneAsync(sceneName);
while (!asyncOperation.isDone)
{
// 这里可以添加卸载进度条显示
Debug.Log($"Unloading progress: {asyncOperation.progress * 100}%");
yield return null;
}
}
// 获取加载进度
public float GetLoadProgress()
{
if (SceneManager.GetActiveScene().isLoaded)
{
return 1.0f;
}
else
{
return 0.0f;
}
}
}