12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- using System;
- using System.Collections.Generic;
- using UnityEngine;
- namespace VEngine
- {
- public class Bundle : Loadable
- {
- public static Func<ManifestBundle, Bundle> customBundleCreator;
- public static readonly Dictionary<string, Bundle> Cache = new Dictionary<string, Bundle>();
- public static readonly List<Bundle> Unused = new List<Bundle>();
- public ManifestBundle info;
- public AssetBundle assetBundle { get; protected set; }
- protected void OnLoaded(AssetBundle bundle)
- {
- assetBundle = bundle;
- Finish(assetBundle == null ? "assetBundle == null" : null);
- }
- protected override void OnUnused()
- {
- Unused.Add(this);
- }
- internal static Bundle LoadInternal(ManifestBundle bundle, bool mustCompleteOnNextFrame)
- {
- if (bundle == null) throw new NullReferenceException();
- if (!Cache.TryGetValue(bundle.nameWithAppendHash, out var item))
- {
- var url = Versions.GetBundlePathOrURL(bundle);
- if (Application.platform == RuntimePlatform.WebGLPlayer)
- {
- throw new NotImplementedException("开源版不提供 WebGL 支持");
- }
- else
- {
- if (customBundleCreator != null) item = customBundleCreator(bundle);
- if (item == null)
- {
- if (url.StartsWith("http://") || url.StartsWith("https://") || url.StartsWith("ftp://"))
- item = new DownloadBundle {pathOrURL = url, info = bundle};
- else
- item = new LocalBundle {pathOrURL = url, info = bundle};
- }
- }
- Cache.Add(bundle.nameWithAppendHash, item);
- }
- item.mustCompleteOnNextFrame = mustCompleteOnNextFrame;
- item.Load();
- if (mustCompleteOnNextFrame) item.LoadImmediate();
- return item;
- }
- internal static void UpdateBundles()
- {
- for (var index = 0; index < Unused.Count; index++)
- {
- var item = Unused[index];
- if (!item.isDone) continue;
- Unused.RemoveAt(index);
- index--;
- if (!item.reference.unused) continue;
- item.Unload();
- Cache.Remove(item.info.nameWithAppendHash);
- if (Updater.Instance.busy) return;
- }
- }
- protected override void OnUnload()
- {
- if (assetBundle == null) return;
- assetBundle.Unload(true);
- assetBundle = null;
- }
- }
- }
|