前言:今天学习动态加载,虽然在前面的时候也使用过,但没有系统的学习过,这次系统的学习一下,开始吧 ~
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删除
(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键,图片精灵变换
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打包,它们是分开打包的
最后:今天的内容就到这里,不过内容还没有学习完,明天会继续~期待相~