Unity3d资源包的使用心得

大学毕业头一年就开始着手做资源管理,不过一开始都是学习使用assetbundle,怎样打资源包,资源包里面资源的一些要求,怎样简单的处理依赖关系,让资源包尽量小一点,打资源包简单,就是把要添加的文件添加进来,然后打包就行了。
一开始我们采用的打资源包的选项是这么设置的

        BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.DisableWriteTypeTree | BuildAssetBundleOptions.UncompressedAssetBundle;

这样打的资源包是没有经过压缩的,所以体积会非常的大,然后所有的依赖关系都包括在资源包里面,在使用的时候直接加载,用AssetBundle.CreateFromFile("路径") 这种方法就可以直接同步的创建资源包,速度很快,资源包大的解决方式是参考了雨松大神的Unity3D研究院之Assetbundle的实战(六十三) 来进行处理的,文章最后面写了步骤,先打资源包,然后LZMA压缩并将资源包上传到你的服务器上面供下载,下载到本地之后,在app里面对资源进行解压,游戏里面直接createformfile就可以使用,解压的过程可能会慢一些,不同的机器性能不同,这样主要是为了减少用户下载资源等待时间,才采取的压缩,最终解压完成之后,资源包依然很大,所以在IOS那头,你的游戏安装包会很大。但是这种方式内存占用量小,加载创建速度快,同步创建,我觉得这种方式不错,奈何显示的包体太大。
再后来我们采用的打包选项是这么设置的
BuildAssetBundleOptions options = BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.DisableWriteTypeTree;
只是将资源包压缩的那个选项给去掉了,资源包果然缩小了好多,相比一开始,至少6倍左右的被缩小,因为这个方法,在一开始打资源报的时候,unity就自动给你压缩了,省的你再处理一遍,通过这种方式打出的资源包,体积小,可以采用
byte[] stream = Global.GetAssetbundleFileInfoByName(_filepath);
bundle = AssetBundle.CreateFromMemoryImmediate(stream);

这种方式来进行加载,但是由于安卓平台jar包的限制,就得采用www的方法,从包体里面取出资源包,然后进行创建,这样就会存在一个异步的过程,然后再调用这种方法,创建资源包。这种方式较上一种在内存占用,进游戏速度上都明显落后,内存占用变高很多,速度也稍微慢了一点,但是唯一的好处是,资源包体积很小,这对于用unity开发的确不错,但是我并不喜欢啊。上面是我先把资源包里面的数据都读出来了,也可以不那样,采用
AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(stream);
yield return acr;
bundle = acr.assetBundle;

这种方式进行创建,效果是一样的。
我们项目里面主要用的是ngui,所以用到了很多Label组件,给上面设置了字体,然后打包的时候,字体关系的依赖非常的多,所以就采用个一个脚本来给Label的Font进行设置,最后再打包的时候,所有的Label组件上面的字体资源都不进行设置,这样打包资源就又小了些,挺好的。

using UnityEngine;
using System.Collections;
public class UILabelFontSet : MonoBehaviour {
    bool isUsedFont = false;
    public enum UILabelFont
    {
        None,
        Msyh,
        Fzzdhjw,
    }
    AssetBundle ab = null;
    public UILabelFont mEffectStyle = UILabelFont.None;
    void Update () {
        if (!isUsedFont )
        {
            if (mEffectStyle == UILabelFont.None)
            {
                return;
            }
            if (mEffectStyle == UILabelFont.Msyh)
            {
                Font _mFont = null;
                UILabel label = this.gameObject.GetComponent();
                     _mFont = (Font)ModulManager.NewOpenFount("ResourcesEx/Font/msyh.ttf", "Font");
                label.trueTypeFont = _mFont;
                isUsedFont = true;
            }
            else if (mEffectStyle == UILabelFont.Fzzdhjw)
            {
                UILabel label = this.gameObject.GetComponent();
                Font _mFont =null;
                    _mFont = (Font)ModulManager.NewOpenFount("ResourcesEx/Font/FZZDHJW.TTF", "Font");
                label.trueTypeFont = _mFont;
                isUsedFont = true;
            }
        }
    }
}

这样在程序运行的时候,先加载资源包,然后就可以根据你的设置用不同的字体喽,哈哈。
在使用了资源报之后,都要对现在的所有用的资源,像图集,脚本,预设进行动态加载,动态关联部分,这样才好,哈哈

又来了个新同事,又得给他讲lua,哈哈

你可能感兴趣的:(unity3d)