使用流程
1.指定资源的AssetBundle属性
2.构建AssetBundle包
3.上传AB包
4.加载AB包和包里面的资源。
AB包不是初始就必須放在服務器的 AB包的特點就是壓縮 體積小 初始出整包的時候AB包肯定在整包裏 放在服務器的ab包是因爲ab可更新 更新的新的ab包
使用流程
1.指定资源的AssetBundle属性
2.构建AssetBundle包
3.上传AB包
4.加载AB包和包里面的资源。
AB包不是初始就必須放在服務器的 AB包的特點就是壓縮 體積小 初始出整包的時候AB包肯定在整包裏 放在服務器的ab包是因爲ab可更新 更新的新的ab包
AssetBundle是存在于硬盘上的文件,可以称之为压缩包。
这个压缩包可以认为是一个文件夹,里面包含了多个文件。
两类:
serialized file(序列化文件) :资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)。直接不能被看到,只有实例化成为游戏物体才能看到
resoure files(源文件):某些二进制资源(图片、声音)被单独保存,方便快速加载。
AssetBundle对象,这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
AssetBundle自身保存着互相的依赖关系;
压缩包可以使用LZMA和LZ4亚索算法,减少包大小,更快的进行网络传输;
可下载内容放在AsetBundle里面,可以减少安装包的大小;
AssetBundle:资源的压缩包
CreateAssetBundles
代码打包
uri是地址,如果要使用本地地址的话,要改一下uri里面的那个file:///改成file:// 不然会识别不到。
如果是用服务器的,那么直接按照老师的来就OK
AssetsBundle的mainfest里面保存了资源路径、资源名称、依赖资源Dependencies、CRC校验码等等。
加载一个有依赖资源的资源的时候,必须要先加载它的依赖资源,即mainfest里面指定的依赖资源。
把共享资源打包到一起,共享资源即依赖资源,这些资源会被其他资源所依赖,UNITY会自动地把一个资源它所依赖的资源都自动打包起来,如果有多个资源都利用到了同样的资源,那么它们会重复地对一个共享资源进行打包,造成空间上的浪费,所以我们需要将共享资源都集中打包,这样UNITY打包那些依赖于共享资源的资源时就不会再去打包共享的资源,因为已经有了,这是UNITY自动做的工作,我们只需要将共享资源都单独地打包出来就OK了,这样就可以节省空间了。
不同资源可放在同一个AssetBundle包里。
AssetBundle路径可以设置为xxx/yyy,这个xxx是一个子目录,yyy是AssetBundle的名字,后缀可随意写。
创建包的方法是 BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
表示在dir目录下创建AssetBundle包,以上面的来看是会在dir目录下的xxx子目录下有一个yyy名的包。第二个参数和第三个参数分别是包选项以及发布包的主机环境
目录Directory.CreateDirectory(dir);这个dir是一个目录名称string类型的
在要用到bundle的manifest时,不需要在程序里直接加载manifest文件,只需要加载对应的bundle,然后bundle里有方法可以获取到对应的manifest文件。
manifest.GetAllAssetBundles() 获取所有assetbundle的名字
manifest.GetAllDependencies("assetbundle");//获取assetbundle所依赖的
bundle的manifest的重要信息
CRC:
Assets : 包含了这个bundle包含的原始资源
Dependencies : 这个bundle依赖的其它bundle
注意,在加载一个bundle的时候,一定要先把它所依赖的bundle加载进来,否则即使在游戏包体中这个bundle用到的资源,bundle里的对象的引用也会丢失。它只会依赖共享包里的资源。
streamingAsset文件夹被打包时不会做任何加密,原封不动的进行打包(放置游戏核心内容,更新资源才进行打包)
所谓的AssetBundle,可以指文件里的具体的bundle文件,也可以指代码里的bundle的内存对象
加载并使用assetbundle的过程:
1、用AssetBundle的接口从文件里加载bundle
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/scene/wall.unity3d");
2、从bundle里通过LoadAsset()等接口加载指定的prefab
GameObject cubewallPrefab = ab.LoadAsset<GameObject>("cubewall");
3、实例化prefab
Instantiate(cubewallPrefab);
打包脚本在Editor模式下执行,需要把代码放到Editor目录下。
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions, BuileTarget);
没有主页的web服务器(以NetBox2.exe所在目录为根目录),是无法通过本机连接访问成功的,因为没有主页
在4.x时代,我们可以通过CreateFromFile或CreateFromMemory方法将磁盘上的文件或内存中的流构造成我们需要的AssetBundle对象。但是在5.x版本中,曾经的这两个方法已经被新的LoadFromFile、LoadFromMemory方法所代替(这两个方法还有异步的版本),且机制上也有了一些区别。
以上便是在运行时动态加载AssetBundle对象的方法。下面,我们再从加载过程中内存消耗的角度来对比一下这几种加载AssetBundle对象的方法,下表是Unity3D官方的一个中文版总结。
如果打包后,预制件有依赖于材质的包,需要先加载材质包,再加载预制件,否则会材质丢失
把材质打包到AssetBundles中,预制件会自动依赖AssetBundles中的材质,所以体积会变小
如果不打包(依赖)材质:
预制件会包含各自的材质,造成资源浪费
从AssetBundles中拖放出来的资源材质 依赖于AssetBundles,而不是本地材质,所以会造成材质丢失