public static byte[] WriteBundle(UnityAssetsBundle assetsBundle)
        {
            var bundleStream = new MemoryStream();
            var bundleWriter = new EndianBinaryWriter(bundleStream);


            if (assetsBundle.Header.Type == EBundleType.UnityFs)
            {
                bundleWriter.Write(assetsBundle.Header.RawStrType, true);
                bundleWriter.Write(assetsBundle.Header.Format);
                bundleWriter.Write(assetsBundle.Header.EngineVer, true);
                bundleWriter.Write(assetsBundle.Header.PlayerVer, true);
                if (assetsBundle.Header.Format == 6)
                {
                    var(info, infoLen, blocks) = BuildFormat6(assetsBundle.Payload);
                    var bundleSize = (long)(bundleWriter.Position + 20 + info.Length + blocks.Length);
                    bundleWriter.Write(bundleSize);
                    bundleWriter.Write(info.Length);
                    bundleWriter.Write(infoLen);
                    bundleWriter.Write(assetsBundle.Payload.Flags);
                    bundleWriter.Write(info);
                    bundleWriter.Write(blocks);
                }
                else
                {
                    throw new NotSupportedException($"Allow only 6 format, but read {assetsBundle.Header.Format}");
                }
            }
            else
            {
                throw new NotSupportedException($"Support only UnityFS, but read {assetsBundle.Header.Type:G}");
            }

            return(bundleStream.ToArray());
        }
Пример #2
0
        public static UnityAssetsBundle ReadBundle(byte[] bundleFileBytes)
        {
            var bundle = new UnityAssetsBundle();
            var reader = new EndianBinaryReader(new MemoryStream(bundleFileBytes));

            //read bundle type
            bundle.Header.RawStrType = reader.ReadStringToNull();
            switch (bundle.Header.RawStrType)
            {
            case "UnityFS": bundle.Header.Type = EBundleType.UnityFs; break;

            case "UnityRaw": bundle.Header.Type = EBundleType.UnityRaw; break;

            case "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA":     //.bytes
            case "UnityWeb": bundle.Header.Type = EBundleType.UnityWeb; break;

            default: throw new NotSupportedException($"Unknown bundle type {bundle.Header.RawStrType}!");
            }

            if (bundle.Header.Type == EBundleType.UnityFs)
            {
                bundle.Header.Format    = reader.ReadInt32();
                bundle.Header.EngineVer = reader.ReadStringToNull();
                bundle.Header.PlayerVer = reader.ReadStringToNull();
                if (bundle.Header.Format == 6)
                {
                    bundle.Payload = ReadFormat6(reader);
                }
                else
                {
                    throw new NotSupportedException($"Allow only 6 format, but read {bundle.Header.Format}");
                }
            }
            else
            {
                throw new NotSupportedException($"Support only UnityFS, but read {bundle.Header.Type:G}");
            }

            return(bundle);
        }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="needs"></param>
        /// <returns></returns>
        private IEnumerator LoadUnityAssetsBundle(AssetParameter[] needs, UnityAssetManager unityAssetManager)
        {
            foreach (AssetParameter par in needs)
            {
                if (DebugMode)
                {
                    UnityEngine.Object assetObject = Resources.Load(par.Path);
                    ResourcesBundle    tem         = new ResourcesBundle((UnityAssetManager)GTLib.AssetManager, par, assetObject);
                    yield return(tem);
                }
                else
                {
                    string            path   = GetPath(par);
                    byte[]            stream = File.ReadAllBytes(path);
                    AssetBundle       bundle = AssetBundle.CreateFromMemoryImmediate(stream);
                    UnityAssetsBundle tem    = new UnityAssetsBundle((UnityAssetManager)GTLib.AssetManager, par);
                    tem.SetAssetBundle(bundle);
                    yield return(tem);
                }
            }
            yield return(null);

            syLoadUnityAssetsBundle = null;
        }