Unity 场景加载和资源加载

这篇具有很好参考价值的文章主要介绍了Unity 场景加载和资源加载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个游戏往往都是由很多场景组成的,例如会有主界面场景、战斗场景…等,不同的场景也是由若干的资源组合而成,在游戏的制作过程中,场景和资源的加载是不可或缺的。不管是场景还是资源都会涉及到加载的问题,在什么时候进行场景或资源的加载?场景的加载和资源的加载如何区分?加载时是使用同步的方式还是异步的方式?…

场景加载

在需要切换到新场景时,就会涉及到场景加载。Unity场景加载分为同步加载和异步加载。

提到场景的跳转,在Unity中想要实现场景转换的前置工作就是将涉及到加载的场景添加到Scenes In Build中。
操作流程:
1、选中File中的Build Settings
unity 加载场景,unity,游戏引擎
2、在Scenes In Build中添加场景
unity 加载场景,unity,游戏引擎

Unity中常用的场景加载相关方法

1、加载场景(同步、异步)

同步加载场景 SceneManager.LoadScene();

此方法的第一个参数可以使用场景的名称(输入名称时要使用字符串)或者在Scenes In Build中对应的数字编号。
此方法的第二个参数是枚举变量,对应的枚举类型是LoadSceneMode,这个枚举类型只有两个值
unity 加载场景,unity,游戏引擎

(1)当给第二个参数赋值LoadSceneMode.Single时,这个加载场景方法就会使得当前游戏中有且仅有我们给定的场景(第一个参数传入的场景)会被加载。
(1)当给第二个参数赋值LoadSceneMode.Additive时,会让我们给定的场景加载,并让这个场景与当前已经加载的场景同时显示。

这种同步的场景加载方式存在一个问题,就是当加载的场景很大很复杂时,加载速度就会变慢,而且加载时会出现卡顿,为了解决这个问题,Unity提供了一个新的方法。

异步加载场景 SceneManager.LoadSceneAsync();

此方法有返回值i,返回值的类型时AsyncOperation,我们可以通过接收这个返回值来跟踪场景的加载进度。

AsyncOperation.isDone 
// 这个是用来判断加载是否完成。这个属性是加载完并且跳转成功后才会变成完成。
AsyncOperation.allowSceneActivation 
// 这个是加载完后,是否允许跳转,当为false时,即使场景加载完了,也不会跳转。
AsyncOperation.progress 
// 这个时表示加载场景的进度。实际上的值时 0 - 0.9, 当值为0.9的时候,场景就已经加载完成了。

需要注意的是,SceneManager.LoadSceneAsync() 方法也可以在普通的方法中调用,但这样做会导致阻塞主线程,从而导致应用程序在加载期间出现卡顿或无响应的情况。所以异步加载场景更推荐卸载协程中使用。

2、获取当前场景 SceneManager.GetActiveScene();

通常使用这个方法是为了进行后续获取信息的一些操作,例如

// 获取当前场景
Scene scene = SceneManager.GetActiveScene();
// 场景名称
Debug.log(scene.name);
// 场景是否已经加载
Debug.log(scene.isLoaded);
// 场景路径
Debug.log(scene.path);
// 场景索引
Debug.log(scene.buildIndex);

3、获取调用场景对象所指向的场景中的所有游戏物体

Scene scene = SceneManager.GetActiveScene();
GameObject[] gos = scene.GetRootGameObjects();

以上都是针对场景的方法,下面介绍一些针对场景管理类而言的方法

4、获得当前加载的场景数量

Debug.log(SceneManager.sceneCount);

这个变量可以获取到当前加载的场景的数量,场景并非在同一时间只能存在一个,它是可以多个叠加起来的。

5、创建一个新的场景

// 方法中的参数是新场景的名称
Scenee scene = SceneManager.CreateScene("newScene"); 

6、卸载场景

// 参数是要卸载的场景的场景名
SceneManager.UnloadSceneAsync(newScene);

卸载这个场景后,场景及其对应的场景文件都会被删除。

分析LoadSceneAsync相关问题

这里之所以将LoadSceneAsync单独拿出来分析,是因为Unity异步加载场景的这个方法确实存在一些小坑,不便于使用者使用。

1、SceneManager.LoadSceneAsync()并不是真正上的后台加载,它是在每一帧加载一些资源;
2、将allowSceneActivation设置为false后,Unity中就只会加载到90%,剩下的要等到allowSceneActivation设置为true才加载。加载到90%时,我们人为控制让其进度条的值为100%,实际并没有加载完成,所以会卡顿;
3、floa类型转int类型的转换规则:值会向零舍入,1.99会返回1,0.9会返回0,所以我这的进度条直接从0到100,就是这个原因,一直返回的是0。

类型转换的规则:
当在int(假设int是32位的)、float和double格式之间进行强制类型转换时,原则如下:
1.从 int 转换成 float,数字不会溢出,但是可能被舍入。
2.从 int、float 转换成 double,能够保留精确的数值。因为 double 有更大的范围和更高的精度(有效位数)。
3.从 double 转换成 float,因为 float 范围要小一些,所以值可能溢出成 +∞ 或 -∞。另外由于float精度较小,还可能被舍入。
4.从 float、double 转换成 int,值将会向零舍入。如1.999会被转成1,-1.999会被转成-1。同时值可能会溢出。

资源加载

资源加载和场景加载类似,也存在同步加载和异步加载。使用Unity开发游戏的过程中,资源的加载一直都是需要重点关注的。

Unity提供的资源加载方式

Unity一共提供了5种资源加载的方式,分别是
1、Resources(只能加载Resources目录中的资源)
2、AssetBundle(只能加载AB资源,当前设备允许访问的路径都可以)
3、WWW(可以加载任意处资源,包括项目外资源(如远程服务器))
4、AssetDatabase(只能加载Assets目录下的资源,但只能用于Editor)
5、UnityWebRequest(可以加载任意处资源,是WWW的升级版本)

同步加载和异步加载的意义和优缺点

既然资源加载有同步和异步两种方式,那必然是因为两者各有优劣,那么了解两者的差异,我们才可以在开发中灵活使用。

1、同步:并不是按字面意思的同时或一起,而是指协同步调,协助、相互配合。是按先后顺序执行在发出一个功能调用时,在没有得到返回结果之前一直在等待,不会继续往下执行。

同步的优点:管理方便,资源准备好可以及时返回。缺点:没有异步快。

2、异步:刚好和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行,异步加载至少有一帧的延迟

异步的优点:速度快与主线程无关。缺点:调用比较麻烦,最好的做法是使用回调。

Unity中Resource常用的资源加载相关方法

1、同步加载资源 Resources.Load();

(1)读取文件时的根目录是 Assets/Resources,所有资源文件都放在该文件夹下,命令中的路径从 Resources 文件夹里开始写。
(2)用 / 表示子文件夹。
(3)读取的文件不要加文件的后缀。
(4)Load 后 <> 中写入读取的类型。

2、异步加载资源 Resources.LoadAsync<>();

Resources 异步加载就是内部新开一个线程进行资源加载,不会造成主线程卡顿。

注意:异步加载不能马上得到加载的资源,至少要等一帧。

比较常用的异步加载资源的方式,一个是事件监听实现异步加载,另一个是协程实现异步加载。两种方式各有优劣,事件监听的方式实现异步加载,优势是写法简单,但是有一定局限性,只能在资源加载结束后进行处理,这实际上属于“线性加载”。协程的方式实现异步加载,优势是可以在协程中处理复杂逻辑(比如,同时加载多个资源、进度条更新等),但相应的编写逻辑会更为复杂,这实际上是类似于“并行加载”。

加载的过渡(加载界面)
不论是场景还是资源,在异步加载的时候,都会存在一个问题,当资源在异步加载的过程中,会存在可能资源未加载完成就切换场景的情况,这样一来就会导致表现效果不好。
Q:资源异步加载的时候怎么解决表现问题?
A:一般来说,最简单的处理方式就是使用UI遮挡一下(加载界面),再有比较常用的方式,就是其他主页点击按钮后先跳转到加载页面场景, 同时异步加载要跳转到的场景。

具体实现加载界面的方法很多,网上的文档也很多,这里就不过多赘述,下面提供几个相关链接以供参考:
1、http://t.csdn.cn/VTTvA
2、http://t.csdn.cn/wlmwq
3、http://t.csdn.cn/h6Pnn

参考文档:
1、https://blog.csdn.net/ChinarCSDN/article/details/82914541
2、http://t.csdn.cn/NfaMx
3、http://t.csdn.cn/wqenA文章来源地址https://www.toymoban.com/news/detail-760121.html

到了这里,关于Unity 场景加载和资源加载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 项目实训--Unity多人游戏开发(十一、PUN框架--游戏场景篇(加载与同步))

    项目实训--Unity多人游戏开发(十一、PUN框架--游戏场景篇(加载与同步))

    本地加载 有许多方法,举几个例子: 本地加载 本地异步加载(场景内容过多时,防止卡顿异步加载) 多人游戏加载场景 pun2插件加载 这个异步加载起初是觉得场景内容如果过多会引起卡顿。所以把这个应用在了单机模式上。 至于多人游戏加载场景,可能用不到而且也没法

    2024年02月01日
    浏览(46)
  • Unity资源加载方式

    Resources:逻辑资源目录,这个目录中的资源会 打入到包 中, 不允许热更 。在打包时会被压缩和加密。 加载方式:Resources.Load(常用) 、 AssetDatabase.LoadAssetAtPath等加载接口 StreamingAssets:Raw资源目录,这个目录中的资源也会 打入到包 中,且允许程序通过Application.streamingAsse

    2023年04月09日
    浏览(11)
  • Unity中资源异步加载

            Unity作为一款优秀的游戏引擎,广泛应用于游戏制作领域。在游戏的开发过程中,资源加载的效率和流畅度尤为重要。对于较大的资源文件,同步加载方式可能会导致游戏卡顿、延迟等问题。因此,采用异步加载的方法可以提高游戏的效率和用户体验。 本篇博客将

    2024年02月06日
    浏览(11)
  • Unity 多场景/大场景加载解决方法

    Unity 多场景/大场景加载解决方法

    记录一下最近学习的新的知识,关于解决多场景加载的问题,方便下次及时的巩固复习。 此次使用的是 Unity的异步加载 来实现功能。 将一个大场景的地图分成好几个场景,利用玩家的距离来判断加载哪个场景和卸载哪个场景。 利用玩家的自身距离和预加载场景的距离判断

    2024年02月04日
    浏览(8)
  • Unity --- 场景/场景管理类 与 异步场景加载法

    Unity --- 场景/场景管理类 与 异步场景加载法

    1.一个游戏是由很多的场景组成的,比如游戏的开始页面,战斗场景,商店页面...等等,这些都是一个个游戏场景 或者比如说:一进入游戏,你一开始来到的是新手村这个场景,出了新手村后来到的就是荒野场景,过来荒野场景后来到的就是大城市场景.....  一个游戏是由很

    2024年02月04日
    浏览(15)
  • Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Unity使用 Addressables 预加载所有资源,提现加载资源,发布webgl加载缓慢问题

    Addressables 我也是刚接触,知道的不是很多,基本的用法还是知道一些的 1 .在Window–Package Manager里找到Addressables进行安装   2.选择资源,点击Assets中的一个资源,在Inspector面板上就会出现一个勾选Assressable,也就是是否加入资源打包的分组,和AssetBundle分组是一个性质。选上以

    2023年04月08日
    浏览(11)
  • Unity场景进度条加载

    Unity场景进度条加载

    首先,创建Canvas,在Canvas中创建一个Button和一个Panel Button:点击之后进入场景加载 Panel:场景加载面板  其次,在panel当中,我们在创建slider和Text Text:用来描述进度条的百分比,所以text可有可无,看自己意愿   slider :就是我们的进度条了 Panel建好后,将SetActive设置为false,

    2023年04月09日
    浏览(7)
  • Unity异步加载场景

    Unity异步加载场景

    当我们的场景资源过大时,为了能够不影响玩家体验,就会使用异步加载。 官方文档:AsyncOperation - Unity 脚本 API AsyncOperation的API allowSceneActivation 允许在场景准备就绪后立即激活场景。 isDone 操作是否已完成?(只读) priority Priority 允许您调整执行异步操作调用的顺序。 pro

    2024年02月02日
    浏览(8)
  • Unity实现异步加载场景

    Unity实现异步加载场景

    一:创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件,放置背景图片,然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的,我们改名为LoadSlider。我们为什么需要改名字,为了见名之一,不至于过段时

    2024年02月12日
    浏览(7)
  • Unity基础 异步加载场景

    异步加载场景的基本概念 在Unity中,异步加载场景是指在游戏运行时,将场景中的资源分批次加载到内存中,以便提高游戏的加载速度和性能。通常情况下,加载场景的过程会在主线程中执行,而异步加载场景可以在后台线程中执行,从而不会阻塞主线程。 要使用异步加载首

    2024年02月12日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包