Unity3d-AssetBundle基本格式分析

原创 2015年04月08日 15:11:57

参考disunity 和云风的分析写的C#版本的 AssetBundle基本格式分析工具:https://github.com/chenanbao/AssetBundleReader


AssertBundle文件头: 

        public void Read(ByteArray bs)
        {
            signature = bs.ReadStringNull();
            streamVersion = bs.ReadInt();
            unityVersion = bs.ReadStringNull();
            unityRevision = bs.ReadStringNull();
            minimumStreamedBytes = bs.ReadInt();
            headerSize = bs.ReadUInt();

            numberOfLevelsToDownload = bs.ReadInt();
            int numberOfLevels = bs.ReadInt();

            for (int i = 0; i < numberOfLevels; i++)
            {
                levelByteEnd.Add(new LevelInfo() { PackSize = bs.ReadUInt(), UncompressedSize = bs.ReadUInt() });
            }

            if (streamVersion >= 2)
            {
                completeFileSize = bs.ReadUInt();
            }

            if (streamVersion >= 3)
            {
                dataHeaderSize = bs.ReadUInt();
            }

            bs.ReadByte();
        }

AssetBundle具体数据使用LZMA压缩(开源库:http://www.7-zip.org/sdk.html):

                SevenZip.Compression.LZMA.Decoder coder = new SevenZip.Compression.LZMA.Decoder();

                uint length = (uint) (fs.Length - header.GetHeaderSize());
                byte[] inBytes = new byte[length];
                inData.ReadBytes(inBytes, 0, length);
                MemoryStream input = new MemoryStream(inBytes);
                MemoryStream output = new MemoryStream();

                // Read the decoder properties
                byte[] properties = new byte[5];
                input.Read(properties, 0, 5);

                // Read in the decompress file size.
                byte[] fileLengthBytes = new byte[8];
                input.Read(fileLengthBytes, 0, 8);
                long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);

                coder.SetDecoderProperties(properties);
                coder.Code(input, output, input.Length, fileLength, null);
                output.Position = 0;

解压后的数据格式如下,一般只包含一个Asset:

            
            uint files = inData.ReadUInt();
            Debug.Log(files);
            for (int i = 0; i < files; i++)
            {
                AssetBundleEntryInfo entryInfo = new AssetBundleEntryInfo();
                entryInfo.Read(inData);
                entryInfos.Add(entryInfo);
                Debug.Log("AssetBundleEntryInfo");

                inData.Postion = (int)entryInfo.GetOffset();
                AssetHeader assetHeader = new AssetHeader();
                assetHeader.Read(inData);
                Debug.Log("AssetHeader");

                MetadataInfo metadataInfo = new MetadataInfo();
                metadataInfo.Read(inData, assetHeader);
                Debug.Log("MetadataInfo");

                //后面的都是小端读取
                inData.IsBigEndian = false;

                ObjectInfoTable objectInfoTable = new ObjectInfoTable();
                objectInfoTable.Read(inData);
                Debug.Log("ObjectInfoTable");

                FileIdentifierTable fileIdentifierTable = new FileIdentifierTable();
                fileIdentifierTable.Read(inData, assetHeader);
                Debug.Log("FileIdentifierTable");
            }

其中ObjectInfo的classID含义可参见:http://docs.unity3d.com/Documentation/Manual/ClassIDReference.html



版权声明:本文为博主原创文章,未经博主允许不得转载。

HTML 基本格式

一、 一.chrome浏览器默认最小字体为12px解决办法: 方式一: 设置浏览器最小字体限制: a. 修改方法一 设置--》高级设置--》网络内容--》自定义字体... 设置成最小字体就可以了。(无...
  • ssjj_programmer
  • ssjj_programmer
  • 2016年12月06日 22:48
  • 222

shell编程--基本格式,基本语法,运算符,expr,(()),$[]

02/shell编程Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash ShellShell也是一门编程语言解释型的编程语言>,即shell脚本一个系统可以存在多个she...
  • toto1297488504
  • toto1297488504
  • 2017年01月01日 17:57
  • 1237

格式塔心理学--产生和基本观点

格式塔心理学的产生和基本观点格式塔学派(德语:Gestalt theorie)是心理学重要流派之一,兴起于20世纪初的德国,由魏特海默(M.Wetheimer,1880~1943)、苛勒(W.kohl...
  • lansatiankongxxc
  • lansatiankongxxc
  • 2015年04月26日 11:16
  • 1376

HTML基本格式及常用标签

一、HTML基本格式: [html] view plaincopy html>             head>                    title>标题title...
  • u013321328
  • u013321328
  • 2015年02月07日 14:21
  • 1093

汇编中基本的指令格式

指令中符号解释:R代表寄存器  M代表内存单元 I代表立即数 运算指令: ADD R/M , R/M/I    加法指令(减法类似) XCHG R/M ,R    两数...
  • qq_28888837
  • qq_28888837
  • 2016年11月18日 19:30
  • 358

定义一个类的标准格式

typedef enum {     SexMan,     SexWomen }Sex;// - 性别; typedef enum  {     ColorBlack,   ...
  • qq_27074387
  • qq_27074387
  • 2015年08月17日 14:13
  • 371

JQ基本语法、插件介绍

5JQ 5.1$.ajax 语法: $.Ajax(JSON); JSON包含常用参数 Url:服务器的地址,获取数据获知推送数据的地方。 Data:要提交过去,给服务器的数据,根据业务...
  • lllllllllaaa
  • lllllllllaaa
  • 2017年08月16日 19:17
  • 713

HTML5基本书写格式:

  • China_Guanq
  • China_Guanq
  • 2016年08月16日 13:23
  • 7515

初识html5基本格式

1.打开sublime text3,打开指定文件夹 2.保持index.html到指定文件夹中,.html是文件后缀名 3.开始编写html的基本格式   !DOCTYPE html>        ...
  • p08010709xsj
  • p08010709xsj
  • 2016年04月14日 16:48
  • 120

jquery几种书写格式

几种书写格式,记录一下 //原始 $(document).ready(function(){ document.write("test1", ""); }); //缩写...
  • fucktester
  • fucktester
  • 2017年04月18日 20:46
  • 406
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3d-AssetBundle基本格式分析
举报原因:
原因补充:

(最多只允许输入30个字)