Пример #1
0
        private void Initialize(EndianBinaryReader reader, string fileName)
        {
            var tableSize         = reader.ReadInt32();
            var dataEnd           = reader.ReadInt32();
            var fileFormatVersion = reader.ReadInt32();
            var dataOffset        = reader.ReadUInt32();

            FileFormatVersion = fileFormatVersion;
            FullFileName      = Path.GetFullPath(fileName);

            var baseDefinitions = false;
            var platform        = 0;

            switch (fileFormatVersion)
            {
            case 6:
                reader.Position  = dataEnd - tableSize;
                reader.Position += 1;
                break;

            case 7:
                reader.Position  = dataEnd - tableSize;
                reader.Position += 1;
                Version          = reader.ReadStringToNull();
                break;

            case 8:
                reader.Position  = dataEnd - tableSize;
                reader.Position += 1;
                Version          = reader.ReadStringToNull();
                platform         = reader.ReadInt32();
                break;

            case 9:
                reader.Position += 4;
                Version          = reader.ReadStringToNull();
                platform         = reader.ReadInt32();
                break;

            case 14:
            case 15:
            case 16:
            case 17:
                reader.Position += 4;
                Version          = reader.ReadStringToNull();
                platform         = reader.ReadInt32();
                baseDefinitions  = reader.ReadBoolean();
                break;

            default:
                throw new FormatException();
            }

            if (platform > 255 || platform < 0)
            {
                platform      = EndianHelper.SwapEndian(platform);
                reader.Endian = Endian.LittleEndian;
            }
            Platform = (AssetPlatform)platform;

            ReadClasses(reader, fileFormatVersion, baseDefinitions);

            if (7 <= fileFormatVersion && fileFormatVersion < 14)
            {
                reader.Position += 4;
            }

            ReadAssetsPreloadTable(reader, fileFormatVersion, dataOffset);

            // May be buggy...
            // The original author assumes these two properties are not used in Unity 2.5.x (in BuildSettings class).
            VersionComponents = VersionSplitter
                                .Split(Version)
                                .Select(str => Convert.ToInt32(str))
                                .ToArray();
            BuildType = BuildTypePattern.Match(Version).Groups["build"].Value;

            // 2017.x version handling is solved by better pattern splitting, so we skipped here.

            if (fileFormatVersion >= 14)
            {
                var someCount = reader.ReadInt32();
                for (var i = 0; i < someCount; ++i)
                {
                    var dummy1 = reader.ReadInt32();
                    reader.AlignBy(4);
                    var pathID = reader.ReadInt64();
                }
            }

            var sharedFileCount = reader.ReadInt32();
            var sharedFileList  = new SharedAssetInfo[sharedFileCount];

            for (var i = 0; i < sharedFileCount; ++i)
            {
                var shared = new SharedAssetInfo();
                shared.SomeName  = reader.ReadStringToNull();
                reader.Position += 20;
                var sharedFileName = reader.ReadStringToNull();
                shared.FileName   = sharedFileName;
                sharedFileList[i] = shared;
            }
            SharedAssetList = sharedFileList;
        }