1.把经常更新的资源放在单独的一个包里,不经常更新的包分离。
2.把需要同时加载的资源放在一个包里
3.可以把其他包共享的资源放在一个单独的包里
4.把一些需要同时加载的小资源打包成一个包
5.如果对于一个同一个资源有两个版本,可以考虑后缀区别
1.把经常更新的资源放在单独的一个包里,不经常更新的包分离。
2.把需要同时加载的资源放在一个包里
3.可以把其他包共享的资源放在一个单独的包里
4.把一些需要同时加载的小资源打包成一个包
5.如果对于一个同一个资源有两个版本,可以考虑后缀区别
1.逻辑实体分组
a.一个UI界面或者所有UI界面一个包(界面里贴图、布局信息一个包)
b.一个角色或者所有角色一个包(角色里模型和动画一个包)
c.所有的场景共享的部分一个包(贴图和模型)
2.按照类型分组
所有声音一个包
shader一个包
模型一个包
材质一个包
3.按照使用分组
把同一时间使用所有资源打成一个包。按关卡分,一个关卡所需要的所有资源包包括角色、贴图、声音。也可以按场景分,一个场景所有资源一个包
1.指定资源的AB属性
(xxxa/xxx)这里xxxa会生成目录,名字为xxx
2.构建AB包
3.上传AB包
4.加载AB包和包里的资源
1.它是一个存在于硬盘上的文件。可称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含多个文件。这些文件可分为两类:
serialized file(序列化文件):资源被打碎放在一个对象中,最后统一被写进一个单独文件(只有一个);
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载
2.它是一个AB对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,
1.AB是一个压缩包包含模型、贴图、预制体、声音、场景等,可以再游戏运行时加载;
2.AB自身保存着相互依赖关系
3.压缩可以使用LZMA和LZ4压缩算法,减少包的大小,更快进行网络传输;
4.把一些可以下载的内容放在AB里,可以减少安装包大小
经常更新放一个包,将不经常更新分离。
需要同时加载的资源放一个单独的包。
其他包共享资源防单独一个包
同时加载的小资源
硬盘文件,分为serialized file(序列文件)和resource files(源文件),
serialized file 打碎文件(只有一个)
resource file可以使声音,图片。
assetbundle 使用步骤: 在unity面板材质右下角,选择是否assetbundle,指定路径,然后代码创建打包类,然后可视化在控制面版生成menuitem ,点击开始打包。
创建一个打包类,代码:
using UnityEditor; using system.io; //引用unityEditor 需要将脚本创建在Editor文件夹下 ,
[menuitem("Assets/Build AssetBundles")] //可视化控制面板
public class CreatAssetBundles(){
static void BuildAllAsset(){
string dir="AssetBundle"
if(directory.Exit(dir)==false)
{
directory.CreatDirectory(dir)
}
buildPipeline.BuildAssetbundles(dir,buildoptions.none, buildtarget.windows64)
}
}}
加载的方法 ,加载本地文件里的ab包,
Assetbundle ab=Assetbundle.LoadFromFile("Assetbundle/Scene/wall.unity3d"); // 从文件夹加载资源包
GameObject wallpfef=ab.loadAsset<GameObject>("Cubewall"); //加载物体资源, 从ab包加载
instantiate(wallpref);
加载单个资源泛型, 加载所有loadAllAssets(), 返回uniyt.object数组 , getAllAssetName获取所有资源名字
安卓平台,需要添加上级目录 :string path = Application.dataPath+"Assetbundle/Scene/wall.unity3d";
卸载AB包,减少内存占用, asset.unload(false) ; false是不卸载被其他物体使用的材质, true是全部卸载
进一步减少包的大小: 打包的时候,先打包共享资源,然后其他的只需要引用不打包。
比如两个模型不一样的墙 共用一个材质和贴图 , 如果先把材质贴图打包,这墙打包的时候只需要地址指向,不再次打包材质贴图 , 如果不把材质贴图先打包,独立打包两种墙, 则每个墙都会把材质贴图包含在内打包,就大了
包的依赖关系, 墙依赖材质贴图的包,所以墙的的preb包和材质包都要加载,不然会丢失材质 。
AssetBundle
第一步制定
什么是AssetBundle;它是储存在硬盘上的压缩文件,它包含两个类分别为
serialized fil(序列化文件)e;资源被打碎放在一个对象中,最后被统一写进一个单独的文件
resource flies(源文件);某些二进制(图片和声音)被单独保存,方便快捷
AssetBundle学习
小知识点,大家一起注意下,必须在Unity的Asset目录下创建正确的Editor文件夹,并将打包的函数放在该文件夹下,否则UnityEditor的头文件引用会报错!
文件校验有三种方式
CRC MD5 SHA1
CRC的安全性比后两者低很多
MD5在04年被王小云给破解了
CRC的计算效率很高,MD5和SHA1比较慢
CRC一般用于从通信数据的校验
MD5和SHA1用于去安全领域,如文件校验和数字签名等。
AssetBundle.Unload(true/false);
unload(true):(推荐使用)
不管游戏物体是否在使用关联的材质,都会卸载
unload(false)
不会卸载正在使用的材质
先加载依赖包,再加载当前包
老师,我这个unity是2017.3的,这么写
加载不出来呢
在使用前加载依赖包
如果本地已经搭建有服务器,可以通过查看软件的端口号,在uri中加入端口号
1:UnityWebReqequest
1:crc:文件校验
2:dependenies:依赖关系
3: