Unity热更新基础
Unity热更新基础
资源的概念:
Assets
目录下,除StreamingAssets
中的东西以外,可以看到的文件,都是资源,每种资源,在Unity中,都有下个类,去映射 对应。
例如:Material,AudioClip,Animation,GameObject(预制件)....
AssetBundle:
资源可以被压缩成AB包,和zip道理一样;
运行时,可以序列化到内存中,AssetBundle
的对象,对应一个AB包的管理;
使用AssetBundle
的API,可以从AB对象中,提取资源的对象
从而,代替原先的Resources中的加载API
定义AB包:
在资源下方标记一个AB包的名字即可,内存中就会定义这个AB包
生成AB包:
使用编辑器脚本,必须在Editor目录下脚本,是编辑器脚本
静态方法上,标记[MenuItem("Day1/BuildAB")]
,菜单编辑器工具
BuildPipeline.BuildAssetBundles("Assets/AssetBundles",BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
不同平台的AB包不通用
生成的每个AB包,都会有一个清单文件.menifest,这个没用,开发时做观察用的;
会根据目标目录的名字,生成一个总清单AB包;这个AB包中,放了一个总清单资源
依赖关系:
资源 之间有依赖关系,如材质,依赖一个Texture, 预制体依赖材质
AB包之间也有依赖关系
如,材质1在A AB包中,预制体在B AB包中,预制体,依赖材质1,那么,B AB包,会依赖 A AB包,否则 会出现资源丢失
清单文件,可以描述,AB包的依赖关系,和该AB,显示包含的资源
冗余:
显示包含的资源,不会出现冗余,只有隐式包含的资源才会冗余,被标记的资源,会被显示包含;未标记的资源,被依赖时,会被隐式包含(即不会显示在清单中)
多个AB包中,隐式包含了相同的资源,就会冗余
打包AB时,会把资源及其依赖的所有资源打包到这个AB包中,如果依赖的资源,被其它AB包显示包含,那么就不会再次包含到本包中
从AB中提取资源
var cubeABPath = GetABPackage()+"cube";//通过方法获得根路径
print(cubeABPath);
//加载ab包的api
var ab = AssetBundle.LoadFromFile(cubeABPath);
var preCube = ab.LoadAsset<GameObject>("Assets/AssetPackage/Prefabs/Cube.prefab");
AB依赖解决资源丢失
加载AB时,必须加载它依赖的Ab,否则提取资源时,资源依赖的资源,会出现丢失
只要将依赖的AB加载到内存中即可,不需要提取依赖的AB中的资源,Unity会自动帮我们提取依赖的资源
Http服务器
可以使用http协议,让我们下载资源
1 修改ip,查询自己的局域网ip: 控制台 ,命令:ipconfig;
2 将AB根目录,拖到http服务器上,选择真实目录
Unity中使用http下载资源
在协程中使用相关API
UnityWebRequest.Get()
获得
相关API
清单资源对象的使用
关于AssetBundleName
是相对AB根目录下的路径
使用UnityWebRequestAssetBundle
和DownloadHandlerAssetBundle
远程获取更新的AB包