历史文章目录连接: https://blog.csdn.net/yy763496668/article/details/113117040 此链接为CSDN连接,目的为方便大家一览博客目录!内容会定期更新。 |
微信公众号:猿媛大本营 |
概述:
实现异步加载场景的代码复用 监测异步场景加载完成操作 |
正文:
近期,粉丝从后台询问异步加载的操作。在这里,我分享一下对异步加载场景的操作,实现代码复用,方便灵活调用。也可作为开发的工具类进行保存
源码如下:
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace YWFramework
{
/// <summary>
/// 异步加载场景
/// </summary>
public class LoadAsyncScene : YWSingleton<LoadAsyncScene>
{
private AsyncOperation async = null;
//进度条的数值
private float progressValue;
// 完成加载后的回调
private Action completedCallback;
// 加载场景
public IEnumerator LoadScene(string nextSceneName, Action<float> callback,Action success=null)
{
completedCallback = success;
async = SceneManager.LoadSceneAsync(nextSceneName);
async.completed += Async_completed;
async.allowSceneActivation = false;
while (!async.isDone)
{
if (async.progress < 0.9f)
{
progressValue = async.progress;
}
else
{
progressValue = 1.0f;
}
Debug.Log(progressValue);
callback?.Invoke(progressValue);
if (progressValue >= 0.9)
{
????????????????????async.allowSceneActivation?=?true;
}
yield return null;
}
}
/// <summary>
/// 完成加载时的回调
/// </summary>
/// <param name="obj"></param>
private void Async_completed(AsyncOperation obj)
{
completedCallback?.Invoke();
}
}
}
描述详情:
YWSingleton<LoadAsyncScene>?这是一基于泛型的一个单例,在这里,小伙伴们可以替换成自己的单例。
开启携程LoadScene?监测场景的加载进度。
参数:
nextSceneName 下一个场景的名称,在场景加载完成后进入下一个场景
callback场景加载进度的回调,便于我们在UI上实时更新场景的加载进度
success 场景在完成时的回调,便于初始化下一个场景的内容
success?需要在场景加载完成时执行
那么需要在异步操作中注册场景加载完成时的回调,
async.completed += Async_completed;
Async_completed 会在场景加载完成后自动调用。
private void Async_completed(AsyncOperation obj)
{
completedCallback?.Invoke();
}
completedCallback? 已通过success?赋值
completedCallback = success;
具体调用:
场景管理器:
为了方便其他场景的调用,在场景管理器中又做了一次封装,减少在后续使用调用中的代码量。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using YWFramework;
/// <summary>
/// 场景的名称枚举
/// </summary>
public enum SceneName
{
Launch=0,
Start,
SimulationExperiment
}
/// <summary>
/// 场景管理器
/// </summary>
public class SceneMgr : YWMonoSingleton<SceneMgr>
{
/// <summary>
/// 异步加载场景
/// </summary>
/// <param name="nextSceneName">场景的名称</param>
/// <param name="callback">回调函数 参数为加载的进度</param>
public void LoadAsynScene(string nextSceneName,Action<float> callback,Action success = null)
{
StartCoroutine(LoadAsyncScene.Instance.LoadScene(nextSceneName,callback,success));
}
}
SceneName?枚举是为了避免在异步加载场景时,填写场景名称发生拼写错误等低级错误引发的加载失败问题而设计的。
终极调用
/// <summary>
/// 进入仿真实验
/// </summary>
private void OnEnterExperimentBtnClick()
{
Debug.Log("进入实验场景");
//打开加载进度面板
UIManager.Open<LoadingScenePanel>();
SceneMgr.Instance.LoadAsynScene(SceneName.SimulationExperiment.ToString(),
//加载进度过程中的回调 value就是加载的值
(value) =>
{
//UI更新进度值
LoadingScenePanel loadingScenePanel = UIManager.GetPanel<LoadingScenePanel>();
UIManager.GetPanel<LoadingScenePanel>().UpdateProgress(value);
},
//加载成功回调
success: () =>
{
UIManager.Close<MainPanel>();
UIManager.Close<LoadingScenePanel>();
});
}
This?is all !?Thanks!
【关注、点赞,收藏】 关注公众号,您将第一时间收到文章更新 微信公众号:猿媛大本营 QQ群号:1056320746 |