Unity3D异步加载场景SceneManager.LoadSceneAsync()卡住,并不异步,获取process直接到0.9的问题

AssetBundle动态加载Scene场景 加载场景有两种方法,一种是常规的build settings添加scene,一种是通过AssetBundle加载Scene。对于需要热更新的项目,如果场景.unity资源变更了,无法在build settings中重新设置,只能用Assetbundle加载场景。 阅读详情
AI摘要

本文探讨了Unity中如何通过异步加载场景来避免加载过程中的卡顿,以提高玩家体验。通常使用SceneManager.LoadSceneAsync()进行异步加载,但在此过程中遇到了加载进度无法实时更新的问题。在编辑器模式下,加载似乎变为同步,导致进度条无法正常工作。然而,当项目打包运行时,异步加载功能恢复正常。解决方案是确保在打包运行时能正确显示加载进度,以创建有效的加载进度条体验。

问题阐述:

        一般来说,在加载场景的时候,会因为所加载资源的大小、复杂度、电脑配置等因素导致加载过程耗费一定的时间。虽然这个加载时间是不可避免的,但是在这一小段卡着的时间里如果就这样卡着的话会大大降低玩家体验。

        所以很多游戏在加载过程中都会显示加载进度条,以及一些加载动画之类的东西。

        但是如果直接采用SceneManager.LoadScene()加载的话,直到场景加载完,整个程序是做不了其他事情的。也就是说,这个函数是一个同步加载的方法。

        那要在加载场景的同时,显示进度条等动画的话,就需要采用异步加载场景的手段。异步加载就是,在加载这个资源的同时,程序的其他部分照常运行,不会因此而卡住。

        这样的话,一方面程序在加载场景,另一方面可以控制画面上的加载进度条、动画等元素的行为活动。

        同时,要实现进度条的话,得获取到场景加载的进度,而这个Unity早就为我们封装好了函数可以直接调用,非常便捷。

        要实现异步加载场景,同时追踪加载的进度,具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using TMPro;

public class SceneLoader : MonoBehaviour
{
    // Start is called before the first frame update
     public  TextMeshProUGUI text;
    void Start()
    {
        StartCoroutine(LoadScene());
        text.text = "";
    }
    IEnumerator LoadScene()
    {
        AsyncOperation operation = SceneManager.LoadSceneAsync("Main",LoadSceneMode.Additive);
        operation.allowSceneActivation = false;
        float progress = 0;
        while (progress < 1f)
        {
            progress = operation.progress;
            text.text +=Time.time+"--loading:" + progress+"\n";

            if (progress >= 0.9f)
            {
                progress = 1.0f;
                text.text += Time.time + "--Load Complished!"+"\n";
                operation.allowSceneActivation = true;
            }
            yield return null;
        }
    }
    // Update is called once per frame
    void Update()
    {
        text.text += Time.time + "Update" + "\n";
    }
}

以上代码实现了异步加载Main场景,加载完成后并显示。同时在画面上显示加载进度信息。(我这里为啥用UI显示而不是直接Debug.Log()到后面就知道了)。

但是在运行的时候发现,开始加载后,一切都会卡住,然后直接跳到0.9加载结束(因为设置了operation.allowSceneActivation = false(即加载场景但是并不激活它),所以异步只会加载到0.9,直到设置其为true则激活场景并且加载结束)。输出信息如下图:

可以看到,加载过程中Update也被停滞了,那这样就还是同步加载并不是异步加载了。 

如果这样的话,制作进度条就是一开始进度为0,卡了几秒后直接进度跳满。那这样进度条就没啥意义了。

问题原因:

        找了半天暂时没找到为啥编辑器模式下异步加载不异步。。。而且Unity源码也看不着。。。

        以后找到了原因再补吧。

解决办法:

        虽然编辑器模式下出现这个问题,但是打包运行的时候就是正常的异步加载。(如下图)

        

 可以看到每一帧都输出了加载进度,并且也没有卡住然后直接跳到0.9这种情况。 

Unity-LoadSceneAsync出现的问题 Unity-LoadSceneAsync跳过Loading场景的问题 出现的问题 如同其他游戏一般,想要在A场景往C场景移动的时候,冒出来一个作为加载场景的B,实现A->B->C的效果,但是实测的时候会出现问题,有但不限于: A、如果C场景太少内容,B没机会出来就直接加载C了,即使已经禁止了allowSceneActivation依然会加载。 B、异步进度一直为零。 分析问题 Unity单次载入场景只能为一个,如果顺序错误似乎会造成程序认为在同时加载B和C(不确定的原因)。 加载B的途中,即使B 阅读详情

相关推荐

【Unity每日一记】SceneManager场景资源动态加载

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

秩沅 5597

Unity异步加载场景SceneManager.LoadSceneAsync与AsyncOperation的使用

1、关于Unity异步加载场景首先要提到两点 ① Application.LoadLevel加载场景的方式早已被SceneManager.LoadSceneAsync("你的场景名称")替代,并且在官方API中有提到使用AsyncOperation来决定操作是否完成,如图: ② 关于AsyncOperation: AsyncOperation的progress(0-1)属性在i...

谁动了我的Girl 7万+

Unity--异步加载场景

Unity--异步加载场景

qq_40669895的博客 4453

SceneManager.LoadSceneAsync 异步加载场景

SceneManager.LoadSceneAsync 异步加载场景

海涛高软 953

搭建云流媒体存储服务+直播+gb81818+智能摄像头,海康威视,大华,华为,国标推流,RTSP 拉流 srs

开源项目:https://github.com/ossrs/srs-docker#usage 1.centos7安装编译 Step1:拉git代码,切换到开发分支 git clone https://gitee.com/winlinvip/srs.oschina.git srs && cd srs/trunk && git remote set-url origin https://github.com/ossrs/srs.git && git

jxyk2007的专栏 3534

Unity2D教程:单例模式、SceneManager.LoadSceneAsync场景切换、Loading界面进度条

关注专栏,持续更新哦 教程总目录 单例模式 一种和static方法较为类似的东西。 下面两种写法的作用类似: public class Config { public static int a; public static void F(){}; } // 调用 Config.a; Config.F(); public class Config { private Config() { } public static readonly Config instance =

QAQ 4032

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3637

异步场景加载详解

异步场景加载是一种在Unity中加载场景的方式,它允许在加载过程中执行其他操作,并提供了加载进度的反馈。通过异步加载,可以避免加载大型场景时的卡顿现象,提高游戏的流畅性和用户体验。

qq_20179331的博客 2279

房产平台系统小程序源码

🏠 一键解锁购房新体验 🔓房产小程序 实现前端 发布二手房 租房 商品 求租 求购等信息;后台发布 新房,二手房租房 商品 写字楼 求租求购等房源信息;功能完善的一块房产小程序。

2401_84413757的博客 795

【数据集】MODIS 的 MOD07 大气廓线产品概述及下载

MODIS 的 MOD07 大气廓线产品概述及下载

WW、forever的博客 550

Unity 切换加载场景 SceneManager.LoadScene

SceneManager.LoadScene public static void LoadScene(int sceneBuildIndex,SceneManagement.LoadSceneMode mode = LoadSceneMode.Single); public static void LoadScene(string sceneName,SceneManagement.Load...

cuijiahao的专栏 1万+

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

Robot_PLC_HMI_Automation 1万+

Unity 场景切换

Unity 场景切换

不在同一频道上的呆子的博客 2202

让 Claude Code 接管 SAP 事务流, 用 Python 和 SAP GUI Scripting 做一个真正能干活的 AI Agent

摘要:SAP系统自动化面临的核心瓶颈在于繁琐的GUI操作而非分析能力不足。通过整合Claude AI、Python和SAP GUI Scripting技术,可构建能直接操作SAP界面的智能代理。该方案利用SAP官方提供的脚本接口,实现事务码执行、界面导航、数据提取等自动化操作,特别适用于DMLT过账引擎等复杂错误分析场景。相比传统SQL导出方案,这种GUI级自动化能处理树控件、ALV表格等复杂界面元素,且无需额外API开发,直接在现有SAP GUI会话上工作,在保持原有权限体系的同时显著提升效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 321

基于深度学习的推荐系统设计与实现

基于深度学习的推荐系统设计与实现 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming / TextGenWebUILLM 基于深度学习的推荐系统设计与实现 关键词:深度学习, 推荐系统, 用

AI天才研究院 1079

Unity 3D开发--SceneManager场景管理(异步使用同一个过渡场景)

在U3D开发过程中经常使用到多场景的切换,有同步SceneManager.LoadScene()和异步SceneManager.LoadSceneAsync()两种方法,同步的话一般就会卡住界面直到加载完成,使用异步的话一般都做一个加载的进度条,每次切换的时候都需要一个加载动画,所以需要建一个专门的过渡加载场景来进行统一加载,也可以避免场景直接切换出现的黑屏。一、建立一个单例进行切换,在项目代码的任何位置都可以调用。要做个进度条然后进行管理,代码很简单就不说了。

一江之水 2278

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

unity学习-异步场景加载

一般异步场景的加载都是会弹跳到进度条界面,进度条界面加载的同时异步场景也会在后台加载,但是为了防止进度条动画没走完场景就跳转了,所以我们可以先将异步操作的结果存储起来。我们可以摒弃掉一定要到最后才加载下一个场景的观念,可以将加载场景的任务设置在任何地方,放在携程函数下,加载场景的任务和游戏运行任务同时进行。//异步场景加载//后台加载。这叫做异步加载场景,需要调用加载场景的SceneManager.LoadSceneAsync()方法。我们的项目在加载场景的时候如果需要加载的场景过大的话就会卡很久,

2401_84659046的博客 738

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

异步跳转场景(异步加载)

的时候让他跳转就完成了异步跳转场景。首先你要给他一个需要跳转的场景。false不跳转,true跳转。,其实就是一个异步工具。

slf_tragon的博客 310

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Unity】 场景异步加载

今天做项目即将结束了,但是遇到了一个问题,场景加载的比较慢,瞬间就想到了异步加载。 然后花了一会的功夫研究了一下。 涉及到的核心类:AsyncOperation 涉及到的方法属性: SceneManager.LoadSceneAsync() :异步加载的方法,参数可以填写序号,也可以填写场景名称 allowSceneActivation :场景加载完毕之后是否可以被激活 progress :数值,场景加载的进度,从0.1到1 前置需要制作一个slider,一个text,以及上一个场景中添加的.

好吃的和好看的都需要用实力来争取 928

◄ Unity 『功能总结』►——场景异步加载LoadSceneAsync

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class Script_LoadSceneAsync : MonoBehaviour { public static Script_LoadSceneAsync Instance; Slider prog.

八哥爱柠檬的博客 3070

Unity 异步加载场景

需要提前加载下一个场景 并得到允许的时候 加载当前预加载的场景

一个默默的游戏制作者...... 359

Unity3d异步场景切换SceneManager.LoadSceneAsync之美

当使用SceneManager.LoadScene同步加载:进入的场景先进行资源的加载,待场景中所有的资源加载完成,才能进行场景和切换。并且原场景资源会立刻销毁 异步加载 SceneManager.LoadSceneAsync() : 异步场景切换,Unity会在后台线程中加载所有资源,并保存之前场景的游戏对象,我们在加载过程中获取到加载的进度,可以播放一个真实的进度条,来看加载进度。 注意...

游戏开发、游戏引擎开发、逆向破解爱好者 1万+

SceneManager的所有用法

SceneManager是Unity中用于管理场景的静态类,提供了一些常用的场景管理功能。

qq_20179331的博客 1772

unity学习24:场景scene相关生成,加载,卸载,加载进度,异步加载场景等

多线程通过操作系统调度,能够充分利用计算资源,在处理I/O密集型和CPU密集型任务时具有优势。// 也是可以在函数内,使用 operation1 时当时声明, 但是函数内声明的,函数外就无法条用operation1,所以为了外面可以调用,还是在外面声明。协程适用于I/O密集型任务,如网络请求、文件读写等,能够实现高效的异步操作。//这个异步的方法,有返回值,返回值是固定的IEnumerator。协程可以在需要时暂停自身,并将控制权交还给调用方,稍后再恢复执行。// 也可以在函数外,最开始声明。

奔跑的犀牛先生 2876

异步加载场景

当场景过大时, 应使用异步加载场景的方式 当有加载场景(没有内容, 给玩家等待的时显得更加友好), 游戏场景使用异步加载方式, 当游戏场景加载完成之后再切换场景 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; p...

iegad2011的博客 371
上一篇: GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(下)
下一篇: 基于pyautogui的自动识别定位原神风物之诗琴按键弹奏程序
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

咖啡咖_CoffCa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值