Unity3d自学记录 AssetBundles相关

引言

先想两个问题:

1.资源较多,导致安装包过大。o(≧口≦)o

2.已经上架的游戏某些资源文件搞错了。┻━┻︵╰(‵□′)╯︵┻━┻

解决方案

        将这些资源文件通过LZMA或者LZ4算法进行压缩,打包,上传至服务器,需要的时候使用http协议进行下载,解压,使用。

AssetBundles(别问我为什么要加s)|ω・)

根据官方文档描述:可以将资源(序列化文件以及源文件)进行打包,并解决了包和包之间的依赖关系,好处呢,比如减少包的大小,以及从远端进行加载资源文件,减少运行内存压力。

解压和加载 

        AB包呢,可以进行压缩进而降低包的大小,主要的算法为两种:LZMA算法以及LZ4算法。总体来说,LZMA算法打的包要比LZ4要小,但是解压时间也比LZ4长,当然哦,也可以不进行压缩,那么解压时间就为0啦,(解压后),从包里加载需要的文件时,也是需要时间的,所以会有每种加载方法都有同步和异步两种。

如何打包眼看着就要成为官方的翻译文档 .....((/- -)/)

1.首先选定需要打包的资源:

Unity3d自学记录 AssetBundles相关_第1张图片

2.选定资源所在的层级结构,如:

Unity3d自学记录 AssetBundles相关_第2张图片

3.手动进行编写打包方法,放进Editor文件夹里(代码摘自官方文档)

using System.IO;
using UnityEditor;


public class CreateAssetBundles 
{
    //特性 在工具栏Assets下创建一个Build AssetBundles选项用以打包
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAssetBundles()
    {
        string assetBundleDir = "Assets/AssetBundles";
        if(!Directory.Exists(assetBundleDir))
        {
            Directory.CreateDirectory(assetBundleDir);
        }
        
        BuildPipeline.BuildAssetBundles(assetBundleDir,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
        /*第二个参数  
          BuildAssetBundleOptions.None LZMA压缩
          BuildAssetBundleOptions.ChunkBasedCompression LZ4压缩
          BuildAssetBundleOptions.UncompressedAssetBundle 不压缩
        */
        /*第三个参数
         选择打包到啥样的平台
         */
    }
}

4.打包后如图结构

Unity3d自学记录 AssetBundles相关_第3张图片

Unity3d自学记录 AssetBundles相关_第4张图片

Unity3d自学记录 AssetBundles相关_第5张图片

以上是整个打包的流程。

 如何加载AB包

AssetBundle.LoadFromMemoryAsync 从内存中加载

AssetBundle.LoadFromFile  从本地磁盘中进行加载

WWW.LoadFromCacheOrDownload 从本地或者服务器(弃用)

UnityWebRequest从web上进行加载

官网直达车 

 包与包依赖问题

Unity3d自学记录 AssetBundles相关_第6张图片

图中所示除了我本身要打包的资源文件,还有一个AssetBundles,打开其.manifest

Unity3d自学记录 AssetBundles相关_第7张图片

从这个总的文件的..manifest里,我们可以获取所有的资源以及他们的依赖,只要在加载特定资源时,将其依赖先进性加载,就可以解决了依赖问题。

     (解释一下,比如先对一个材质进行打包,再对其他使用该材质的预制体进行打包,就会产生依赖关系,那,为什么不一起打包呢?因为如果有多个预制体都使用到了该材质,并且一起打包,该材质文件就会重复被保存,使得包变大敲黑板!!!

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset("AssetBundleManifest");
string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for.
foreach(string dependency in dependencies)
{
    AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
}

以上代码均来自于官方网站。 

 

包的卸载 

在第一个场景里加载的包在第二个场景里没有用处的话,我们就要考虑将其手动卸载调,毕竟占内存撒。

AssetBundle.Unload(bool)

解释一下官方的栗子:

假如材质M是AB包里的实例话出来的,是在内存中的

and假如参数为true 那么,结果是不光这个包没了,并且这个M也没了

and假如参数为false,那么,结果是这个包没了,并且断掉了这个M与包AB的连接,如果重新加载,就会重新加载一个M,而不是和之前的进行连接,就存在了两个M副本。

enmmm,所以说false是不常用的,最后还有说一个方法:

Resources.UnloadUnusedAssets

字面意思就是卸载无用的资源,这个方法是当不得不用false的时候,用这个卸载没有链接的资源。

参考文档

官方文档

文档1

 

全剧终!(果然成了翻译文档(lll¬ω¬))

ps:留校学习中!!!(欸,其实回家也没那么好,是吧。。。我的良心去哪了。。。)

你可能感兴趣的:(Unity3d)