【Unity案例小技巧】场景异步先加载,再激活

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏unity每日一记

🅰️推荐文章


【软件设计师高频考点暴击】

【Unityc#专题篇】之c#系统化大礼包】

【unity数据持久化】数据管理类_PlayerPrfs

【unity本站最全系列】unity常用API大全一篇文章足以
在这里插入图片描述




先加载再激活

  • 适用于异步加载场景时,先加载,再激活
    在这里插入图片描述
public class MainMenu : MonoBehaviour {

    //包含游戏本身的场景的名称。
    public string sceneToLoad;

    //包含“正在加载…”文本的UI组件。
    public RectTransform loadingOverlay;

    //表示场景背景加载。
    //这用于控制场景何时切换。异步操作场景加载操作;
    AsyncOperation sceneLoadingOperation;

    //开始时,开始加载游戏。
    public void Start() {

        //确保“加载”覆盖不可见
        loadingOverlay.gameObject.SetActive(false);

        //开始在后台的场景中加载。。。
        sceneLoadingOperation = SceneManager.LoadSceneAsync(sceneToLoad);

        // ...在我们准备好之前,不要切换到新场景。
        sceneLoadingOperation.allowSceneActivation = false;


	}

    //当点击“开始游戏”按钮时调用。
    public void LoadScene() {

        //使“加载”覆盖可见
        loadingOverlay.gameObject.SetActive(true);

        //告诉场景加载操作切换场景当它完成加载时。
        sceneLoadingOperation.allowSceneActivation = true;

	}

}



场景加载知识API


👨‍💻👍加载场景的方法

  • SceneManager.LoadScene() ; 场景同步加载
  • SceneManager.LoadSceneSAsyn(); 场景异步加载
  • SceneManage。GetActiveScene().name判断当前场景
  • Application.LoadLevel():同步加载
  • Application.LoadLevelAsync():异步加载
  • Application.LoadLevelAddictive():同步附加式加载
  • Application.LoadLevelAddictiveAsync():异步附加式加载

👨‍💻👍SceneManasger的操作

首先添加场景加载的命名空间Using UnityEngine.SceneManagement ;
而后把游戏场景都保存(拖拽)在 Buid setting 里面,相当于存储场景的目录

在这里插入图片描述


1.同步加载

SceneManager.Load( 序列号) ;
SceneManager.Load( “场景名”) ;

 void Start()
    {
        //SceneManager.LoadScene(1);
        //SceneManager.LoadScene("TriggerTest");
    }


缺点:加载时造成画面卡帧,因为,在未加载完成前画面是停止的,所以是卡帧现象


2.异步加载

如果当前场景 对象过多或者下一个场景对象过多
这个过程会非常的耗时 会让玩家感受到卡顿
所以异步切换就是来解决该问题的

通常我们和协程一起使用:

  • SceneManager.LoadAsync(序列号)

  • SceneManager.LoadAsync(“场景名”)

  • StartCoroutine(协程迭代器方法() ); //调用协程

  • AsyncOperation 该类型翻译为异步操作 ,为下面获得异步场景的返回值
    AsyncOperation ao= SceneManager.LoadSceneAsync(2);

  • ao.allowSceneActivation = true 激活场景

  • ao.progress 场景加载的进度

//-----1.通过事件回调函数 异步加载------

        AsyncOperation SS = SceneManager.LoadSceneAsync("XXXX");
        SS.completed += (a) =>
        {
            print("加载结束");
        };
        SS.completed += LoadOver;
      private void LoadOver(AsyncOperation ao)
      {
        print("LoadOver");
      }

//---------2.通过协程异步加载--------
     
    void Start()
    {   
        //由于场景加载后就不会执行加载后的逻辑了,如果要保存就使用 DontDestroyOnLoad(保留场景加载上个场景的东西)第一个异步方法不会出现该情况
        DontDestroyOnLoad(this.gameObject); 
        StartCoroutine(LoadScene("XXXX"));
    }
    
    IEnumerator LoadScene(string name)
    {     
        AsyncOperation SS= SceneManager.LoadSceneAsync(name);                      
//根据游戏规则 自定义进度条变化的条件
        yield return SS;
        //1.场景加载结束 更新20%
        //2.动态加载怪物再更新20%
        //3.动态加载场景模型进度条顶满 
        //4.加载结束隐藏进度条
    }

总结

场景异步加载 和 资源异步加载 一样

    1.通过事件回调函数
    2.协程异步加载
  • 1.事件回调函数
    优点:写法简单,逻辑清晰
    缺点:只能加载完场景做一些事情 不能在加载过程中处理逻辑

  • 2.协程异步加载
    优点:可以在加载过程中处理逻辑,比如进度条更新等
    缺点:写法较为麻烦,要通过协程

场景管理器
public class SceneControl
{
    private static SceneControl instance = new SceneControl();

    public static SceneControl Instance => instance;

    private SceneControl() { }

    public void LoadScene(string name, UnityAction action)
    {
        AsyncOperation SS = SceneControl.LoadSceneAsync(name);
        SS.completed += (Scene) =>
        {
            action();
        };
    }
}


🅰️系统路线学习点击跳转


【Unityc#专题篇】之c#进阶篇】

【Unityc#专题篇】之c#核心篇】

【Unityc#专题篇】之c#基础篇】

【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秩沅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值