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



相关文章推荐

Unity3D开发之自绘地形图

项目中肯定会遇到需要用户自己绘制地形的需求,然后根据地形自动生成房间。下面说说我在绘制地形的实现方法。 我们百度可以看到很多关于自己创建mesh的博客,mesh的生成需要三角面顶点坐标以及顶点序列。所...

[Unity技巧]使用vs调试unity

以前都是通过打印信息来"调试程序"的,这次一定要改掉这个坏习惯了! 这里给出的是快捷键,当然也可以直接点击面板上的按钮了。 vs调试: F5:开始调试,如果处于调试状态下,则程序继续执行,直到遇到...
  • lyh916
  • lyh916
  • 2015年05月01日 23:06
  • 1485

Unity3d资源反编译. AssetBundle格式简析+简单应用+爬坑

===================  Unity3d资源反编译工具 DisUnity ================ 源码:https://github.com/ata4/disuni...
  • ldghd
  • ldghd
  • 2015年05月01日 10:13
  • 3732

Unity 3D-新版AssetBundle(API介绍&基本分析)

之前介绍了Unity4.x时代的AssetBundle的基本API和简单应用,主要分析一下Unity5.x后新版本的AssetBundle的一些API用法,以及新版AssetBundle系统的优点。 ...

Unity3D 5.3 新版AssetBundle使用方案及策略

Unity3D 5.3 新版AssetBundle使用方案及策略 作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保...
  • kenkao
  • kenkao
  • 2017年02月05日 11:47
  • 2685

[Unity3d]安卓无法加载assetbundle的问题

前几天做了AssentBundle的例子,遇到了问题,在论坛上问了三天都没人解答,最后在一个朋友的帮助下解决了。下面介绍AssentBundle。 AssetBundles让你通过WWW类流式加载额...

Unity3D引擎WWW资源加载和缓存(AssetBundle、Texture、Audio)

Unity3D引擎WWW资源加载和缓存(AssetBundle、Texture、Audio)

Unity3D中实现按资源名称自动化命名打包AssetBundle

1. 概述 一般当需要打包成AssetBundle的资源不多时,可以自己通过AssetLabels窗口手动命名,然后再打包,但是当需要打包的资源过多时,一个一个的去手动编辑就特别的麻烦,因此如果...
  • ithot
  • ithot
  • 2017年07月14日 19:09
  • 308

Unity3D 关于资源加载(Resources和AssetBundle)和内存管理

Unity3D 的动态加载机制,本地加载和远端加载以及简单的内存管理
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3d-AssetBundle基本格式分析
举报原因:
原因补充:

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