Пример #1
0
        public static byte[] Serialize(BundleDatas o)
        {
            var s         = new MemoryStream();
            var formatter = new BinaryFormatter();

            formatter.Serialize(s, o);
            return(s.ToArray());
        }
Пример #2
0
        static void CacAssetBundleSize()
        {
            var BundlePath = BundleSavePath + "/";
            var srcAMF     = BundlePath + Helper.BundleSaveName;

            if (File.Exists(srcAMF))
            {
                var ab  = AssetBundle.LoadFromFile(srcAMF);
                var abm = ab.LoadAsset <AssetBundleManifest>("AssetBundleManifest");
                ab.Unload(false);

                // Create Map from asset to AssetBundle.
                var data    = new BundleDatas();
                var bundles = abm.GetAllAssetBundles();
                foreach (var bundle in bundles)
                {
                    var bd = new BundleData
                    {
                        bundleInPack       = false,
                        bundleName         = bundle,
                        bundleHash128      = abm.GetAssetBundleHash(bundle),
                        bundleDependencies = abm.GetDirectDependencies(bundle),
                        bundleSize         = new FileInfo(BundlePath + bundle).Length
                    };
                    data.Datas.Add(bundle, bd);

                    var bdm    = AssetBundle.LoadFromFile(BundlePath + bundle);
                    var bdabns = bdm.GetAllAssetNames();
                    var bdabps = bdm.GetAllScenePaths();
                    bdm.Unload(true);
                    foreach (var asset in bdabns)
                    {
                        if (!data.Names.ContainsKey(asset.ToLower()))
                        {
                            data.Names.Add(asset.ToLower(), new BundleName()
                            {
                                bundleName = bundle
                            });
                        }
                        if (asset.EndsWith(".spriteatlas", StringComparison.Ordinal))
                        {
                            var deps = AssetDatabase.GetDependencies(asset, false);
                            foreach (var dep in deps)
                            {
                                string spriteName = string.Empty;
                                if (Helper.ConvertToAtlasSpriteName(dep, out spriteName))
                                {
                                    data.Names[dep.ToLower()] = new BundleName()
                                    {
                                        atlasSprite = true, bundleName = bundle, atlasName = asset, spriteName = spriteName
                                    };
                                }
                            }
                        }
                    }
                    foreach (var asset in bdabps)
                    {
                        data.Names.Add(asset.ToLower(), new BundleName()
                        {
                            bundleName = bundle
                        });
                    }
                }

                var bytes  = BundleDatas.Serialize(data);
                var nbytes = Crypto.ZLib.Zip(bytes);
                //bytes = Crypto.UnZip(nbytes);
                //var obj = ScriptableBundleData.Deserialize(bytes);
                File.WriteAllBytes(srcAMF + "_size", nbytes);
            }
        }
Пример #3
0
        public static IEnumerator Initialize()
        {
            bool netError = false;

            s_BundleDatas.Clear();
            s_BundleNames.Clear();
            if (true)
            {
                string netAMF = Helper.GetDataPath(Helper.BundleSaveName) + "_size";
                var    www    = UnityWebRequest.Get(netAMF);
                Debug.Log(netAMF);
                yield return(www.SendWebRequest());

                if (!www.isNetworkError && !www.isHttpError)
                {
                    var bytes  = www.downloadHandler.data;
                    var nbytes = Crypto.ZLib.UnZip(bytes);
                    var data   = BundleDatas.Deserialize(nbytes);
                    foreach (var bd in data.Datas)
                    {
                        s_BundleDatas.Add(bd.Key, bd.Value);
                    }
                    string atlasName = string.Empty;
                    foreach (var kv in data.Names)
                    {
                        var key = kv.Key.ToLower();
                        if (s_BundleNames.ContainsKey(key))
                        {
                            Debug.LogError(key + " " + kv.Value + " " + s_BundleNames[key]);
                            continue;
                        }
                        s_BundleNames.Add(key, kv.Value);
                        if (Helper.ConvertToAtlasName(key, out atlasName))
                        {
                            if (s_AtlasNames.ContainsKey(atlasName.ToLower()))
                            {
                                Debug.LogError(atlasName + " - " + key + " : " + s_AtlasNames[atlasName]);
                                continue;
                            }
                            s_AtlasNames.Add(atlasName.ToLower(), key);
                        }
                    }
                }
                else
                {
                    Debug.LogError("Get " + netAMF + " -> " + www.error);
                    netError = true;
                }
                www.Dispose();
            }

            if (netError)
            {
                var locAMF = Helper.GetInternalPath(Helper.BundleSaveName) + "_size";
                Debug.Log(locAMF);
#if UNITY_ANDROID
                var www = new WWW(locAMF);
#else
                var www = new WWW("file:///" + locAMF);
#endif
                yield return(www);

                if (string.IsNullOrEmpty(www.error))
                {
                    var bytes  = www.bytes;
                    var nbytes = Crypto.ZLib.UnZip(bytes);
                    var data   = BundleDatas.Deserialize(nbytes);
                    foreach (var bd in data.Datas)
                    {
                        s_BundleDatas.Add(bd.Key, bd.Value);
                    }
                    string atlasName = string.Empty;
                    foreach (var kv in data.Names)
                    {
                        var key = kv.Key.ToLower();
                        s_BundleNames.Add(key, kv.Value);
                        if (Helper.ConvertToAtlasName(key, out atlasName))
                        {
                            if (s_AtlasNames.ContainsKey(atlasName.ToLower()))
                            {
                                Debug.LogError(atlasName + " - " + key + " : " + s_AtlasNames[atlasName]);
                                continue;
                            }
                            s_AtlasNames.Add(atlasName.ToLower(), key);
                        }
                    }
                }
                else
                {
                    Debug.LogError("Get " + locAMF + " -> " + www.error);
                }
            }

            if (true)
            {
                var srcAMF = Helper.GetInternalPath(Helper.BundleSaveName);
#if UNITY_ANDROID
                var www = new WWW(srcAMF);
#else
                var www = new WWW("file:///" + srcAMF);
#endif
                yield return(www);

                if (string.IsNullOrEmpty(www.error))
                {
                    var ab  = www.assetBundle;
                    var abm = ab.LoadAsset <AssetBundleManifest>("AssetBundleManifest");
                    ab.Unload(false);
                    foreach (var bd in s_BundleDatas)
                    {
                        if (bd.Value.bundleHash128 == abm.GetAssetBundleHash(bd.Key))
                        {
                            bd.Value.bundleInPack = true;
                        }
                    }
                }
                else
                {
                    Debug.LogWarning("Get " + srcAMF + " -> " + www.error);
                }
            }
        }