动态加载(Dynamic Load)

前言:今天学习动态加载,虽然在前面的时候也使用过,但没有系统的学习过,这次系统的学习一下,开始吧 ~


1.加载场景

1.1普通加载

(1)创建两个场景Scene0101、Scene0102,场景1在(0,0,0)放个Cube,场景2在(1,0,0)放个Sphere

(2)将场景放在Scenes In Build

(2)创建脚本LoadSceneTest

<1>引用UnityEngine.SceneManagement;   //场景加载的命名空间

1)根据场景名称加载场景:SceneManager.LoadScene(场景名字);

2)根据场景建设索引加载场景:SceneManager.LoadScene(场景建设索引);

3)根据场景名称单个加载场景:SceneManager.LoadScene(场景名字,LoadSceneMode.Single);

4)根据场景建设索引叠加加载场景:SceneManager.LoadScene(场景建设索引,LoadSceneMode.Additive);

<2>引用 UnityEngine;

1)加载时不销毁对象:DontDestroyOnLoad(对象);

(1)把Cube的标签设为Player,代码中是通过查找Player这个标签来查找不销毁的对象的

(2)在场景Scene0101中随意挂载脚本,按A键来实现相应的功能

(3)注意事项:

<1>咱们是要切换场景,从Scene0101切换到Scene0102,所以脚本挂载在Scene0101中的任意对象

<2>DotDestroyOnLand在Awake方法中使用

<3>当使用DotDestroyOnLand的时候,不要使用叠加加载场景,会出现重复,所以使用单个加载场景

<4>当使用DontDestroyOnLand转换场景的时候,对象会进行自动烘焙,材质会变成灰色,还没学,先不讲

1.2异步加载

(1)异步加载:当加载的东西很多的时候,需要一定的时间进行加载,不然会出现卡顿的现象,为了避免这种情况的发生,我们使用异步加载,就是用一个场景做一个进度条来显示需要加载的场景的进度,同时这个需要加载的场景也在加载,可以理解为进度条场景和需要加载的场景同时加载

(2)首先创建三个场景Scene0103、Scene0104、Scene0105,Scene0104中创建一个图片铺满整个画布,再创建一个滑条,去掉滑块,填充块(Fill)设为红色,Fill Area调整到刚好跟Background一样大,这样才能看到Fill刚好充满整个Background

(3)Scene0105中,我们导入环境包,创建地形,我们去种一些树

导入环境包
地形创建

(4)选中地形,选中中树面板,点击Edit Trees>>Add Tree

(5)点击后会弹出Add Tree窗口,把要添加的树拖到Tree Prefab中,点击Add

(6)选中地形,多了一个树的预设体,点击Mass Place Trees

(7)弹出Place Trees窗口,Number Of Trees设为100,点击Place

种树后的画面

(8)创建脚本Scene3To4

功能:按下A键实现切换场景建设索引为3的场景


(9)创建脚本Scene4To5

功能:进度条的Fill每帧填充0.05,异步加载场景建设索引为4的场景

<1>引用UnityEngine;

类:AsyncOperation(异步加载设置参数)

1)AsyncOperation类

1.1)异步加载进度:对象.progress

<2>引用UnityEngine.SceneManagement;

类:SceneManager

1)SceneManager类

1.1)类名.LoadSceneAsync()

有四种重载,跟普通加载场景的参数一样,可以对比普通加载的参数,不同点就是一个是普通加载,一个是异步加载

(10)将Scene0103、Scene0104、Scene0105拖到Scenes In Build中,后面的数字就是对应每个场景的场景建设索引

(11)把脚本Scene3To4挂载到场景Scene0103的随意对象身上,把脚本Scene4To5挂载到场景Scene0104的随意对象身上,把Silder拖到脚本Scene4To5中,点击进入场景Scene0103,点击运行,点击Game窗口,按下A键,切换到了场景Scene0105中,并打印了异步加载的进度

场景如图

2.ResourcesTest

(1)创建一个Cube和一个Image,Cube拖到工程目录中,设为预设体,把场景中的Cube删除

创建Cube和Images

(2)新建一个Resources文件夹(在使用Resources.Load(对象路径)的时候会自动寻找Resources文件夹,找它底下的对象路径),把Cube预设体和一张图片放到这里拖到此文件夹中,

拖入之后

(3)创建脚本ResourcesTest

功能:按A键克隆Cube,按B键更换图片精灵

<1>引用UnityEngine;

类:Resources、GameObject

1)Resources类

1.1)动态加载对象:类名.Load<对象类型>(对象路径);

注意:在Resources文件夹下查找对象路径

2)GameObject类

2.1)查找对象:类名.Find(对象名);

(4)为了方便观察,我们把Cube预设体的位置设为(0,0,0);并把画布的Render Mode设为Sreen Space-Camera,主摄像机拖到Render Camera中;Scene窗口菜单中选择2D

(5)把脚本挂载到随意对象的身上,点击运行,按下A键,Cube出现;按下B键,图片精灵变换

按A键,Cube出现
按下B键,图片精灵变换

3.AssetBundle

AssetBundles 可以包括的资源文件有模型文件(models)、材质(materials)、纹理(textures)和场景(scenes)。AssetBundles 不能包含脚本文件。

点击工程中的文件,在右下角会出现一个预览窗口,最下面会有这个AssetBundle,默认是None,

这里我们可以新建AssetBundle名字,给它设置打包的路径,路径随便填,

我们可以直接设置路径(只能小写,就算你大写了,它也会自动转换成小写),打包的名字随意发挥,后缀名也随意发挥(注意:如果光写了代码,而没有设置AssetBundle名字,是不能实现打包的)


(1)创建Editor文件夹(在进入编辑器的时候会提前编译,不需要运行)在它底下创建一个脚本CreateAB

(2)然后就会发现菜单栏中多了个菜单AB

功能:打包所有设置了AssetBudleName的对象、打包选中的对象、把选中的对象的名字设置为每个对象的AssetBundleName

<1>引用UnityEditor;

类:Editor、MenuItem、BuidPipline、AssetDatabase、AssetBundleBuild、Selection、AssetImporter

1)Editor

2)MenuItem

2.1)创建菜单:[MenuItem(菜单路径)]

3)BuidPipline

3.1)默认采用LZMA格式进行压缩,压缩率较大:类名.BuildAssetBundles(输出路径,BuildAssetBundleOptions.None,打包的平台);

3.2)采用LZ4进行压缩,基于Chunk算法,压缩率较小:类名.BuildAssetBundles(输出路径,BuildAssetBundleOptions.ChunkBasedCompression,打包的平台);

3.3)不压缩,资源最大,但是访问速度最快:类名.BuildAssetBundles(输出路径,BuildAssetBundleOptions.UncompressedAssetBundle,打包的平台);

3.4)强制进行重新打包:类名.BuildAssetBundles(输出路径,BuildAssetBundleOptions.ForceRebuildAssetBundle,打包的平台);

3.5)类名.BuildAssetBundles(输出路径,AssetBundle设置对象,打包格式,打包的平台);

注意:打包格式跟前面的几个一样,也是四种

4)AssetDatabase

4.1)刷新:类名.Refresh();

4.2)获取对象的绝对路径:类名.GetAssetPath(对象);

5)AssetBundleBuild

5.1)AssetBundle压缩包的名字:类名[i].assetBundleName=名字;

6)Selection

6.1)鼠标选中的对象:类名.objects

7)AssetImporter

7.1)得到路径:类名.GetAtPath(路径)

7.2)对象的AssetBundle名字:对象.assetBundleName

7.3)保存并且重新导入对象:对象.SaveAndReimport();

<2>注意:

        1)打包方式单一

        2)具有相同名字的资源,会打到一个Bundle当中

        3).manifest是bundle的配置文件,

        4)每一个bundle都有这样一个配置文件,通过它可以查看每个bundle中的版本、hash、资源和依赖等信息,

        还有一个总的配置文件(与打包的输出目录重名),通过总的配置文件,可以查看一个有多少个bundle包和每个bundle的信息

        5)资源没变的bundle,不会触发重新打包,即使bundle删除了也不会重新打包,但是配置文件丢失会触发重新打包

(2)打包路径对应:工程目录下路径对应代码中的路径

(3)我们回到Unity编辑器中,由于Editor文件夹是个特殊的文件夹,它里面的代码,Unity编辑器会提前编译,所以我们当我们转到Unity编辑器的时候代码就编译好了,也就出现了AB这个我们代码中写的一个编辑器扩展的菜单,菜单的内容对应着代码中的菜单1、2、3,实现相应的功能。第一个是打包所有设置了AssetBudle名字的对象、第二个是打包选中的对象,并把它们的AssetBundle名字改为custom、第三个是把选中的对象的名字设置为每个对象的AssetBundle名字


<1>选中BuildAll,会打包所有的设置了AssetBundle名字的对象,在打包路径下会多出它们的AssetBundle包和对应的配置文件,以及路径文件和路径文件配置文件

1)AssetBundle包:资源的压缩包

2)AssetBundle包的配置文件:有HashID(32位)、Assets(资源绝对路径,真正的名字)、Dependencies(依赖关系)

3)路径文件:跟路径文件夹相同名字的文件(白色的)

4)路径文件的配置文件:跟路径文件夹相同名字的文件(黑色的),对应打包的所有对象的AssetBundleName(AssetBundle名字)、Dependencies(AssetBundle的依赖)

<2>第二个是打包选中的对象,并把它们的AssetBundle压缩包的名字改为custom

选中一个对象打包
选中多个对象打包

<3>第三个是把选中的对象的名字设置为每个对象的AssetBundle名字

默认状态
点击菜单之后

(4)依赖关系

把依赖的关系和依赖本体分开打包,可以节省内存空间。如果都放在本体中打包,每个本体也需要把相应的依赖关系一起打包,如果很多个本体都需要相同的依赖关系,就得打包多次依赖关系,很占内存,所以我们采取分开打包的方式,把本体和依赖关系分开打包,当多个本体都需要同一个依赖关系的时候,我们只需要打包这一个依赖关系即可

<1>如果使用默认材质球,则没有依赖关系

<2>把mat材质球和Sphere1设置AssetBundle先SetABName然后BuildAll(BuildAl只打包设置了AssetBundle名字的对象)

<3>查看Sphere1对象的AssetBundle压缩包文件,在里面看到sphere1和mat文件大小差不多大

<4>现在我们把mat材质球拖给Sphere1对象,让它依赖mat,再次打包

<5>存在依赖关系之后,我们再打包之后,发现sphere1的AssetBundle压缩包文件大小变成了2KB,mat还是那么多,说明当我们让Sphere1对象依赖mat后,我们再对sphere1和mat打包,它们是分开打包的


最后:今天的内容就到这里,不过内容还没有学习完,明天会继续~期待相~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容