| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- namespace VEngine
 
- {
 
-     public enum LoadableStatus
 
-     {
 
-         Wait,
 
-         Loading,
 
-         DependentLoading,
 
-         SuccessToLoad,
 
-         FailedToLoad,
 
-         Unloaded,
 
-         CheckVersion,
 
-         Downloading
 
-     }
 
-     public class Loadable
 
-     {
 
-         protected internal static readonly List<Loadable> Loading = new List<Loadable>();
 
-         protected readonly Reference reference = new Reference();
 
-         public LoadableStatus status { get; protected set; } = LoadableStatus.Wait;
 
-         public string pathOrURL { get; set; }
 
-         protected bool mustCompleteOnNextFrame { get; set; }
 
-         public string error { get; internal set; }
 
-         public bool isDone => status == LoadableStatus.SuccessToLoad || status == LoadableStatus.Unloaded ||
 
-                               status == LoadableStatus.FailedToLoad;
 
-         public float progress { get; protected set; }
 
-         protected void Finish(string errorCode = null)
 
-         {
 
-             error = errorCode;
 
-             status = string.IsNullOrEmpty(errorCode) ? LoadableStatus.SuccessToLoad : LoadableStatus.FailedToLoad;
 
-             progress = 1;
 
-         }
 
-         public static void UpdateAll()
 
-         {
 
-             for (var index = 0; index < Loading.Count; index++)
 
-             {
 
-                 var item = Loading[index];
 
-                 if (Updater.Instance.busy) return;
 
-                 item.Update();
 
-                 if (!item.isDone) continue;
 
-                 Loading.RemoveAt(index);
 
-                 index--;
 
-                 item.Complete();
 
-             }
 
-             Asset.UpdateAssets();
 
-             Scene.UpdateScenes();
 
-             Bundle.UpdateBundles();
 
-             ManifestAsset.UpdateManifestAssets();
 
-         }
 
-         internal static void Add(Loadable loadable)
 
-         {
 
-             Loading.Add(loadable);
 
-         }
 
-         internal void Update()
 
-         {
 
-             OnUpdate();
 
-         }
 
-         internal void Complete()
 
-         {
 
-             if (status == LoadableStatus.FailedToLoad)
 
-             {
 
-                 Logger.E("Unable to load {0} {1} with error: {2}", GetType().Name, pathOrURL, error);
 
-                 Release();
 
-             }
 
-             OnComplete();
 
-         }
 
-         protected virtual void OnUpdate()
 
-         {
 
-         }
 
-         protected virtual void OnLoad()
 
-         {
 
-         }
 
-         protected virtual void OnUnload()
 
-         {
 
-         }
 
-         protected virtual void OnComplete()
 
-         {
 
-         }
 
-         public virtual void LoadImmediate()
 
-         {
 
-             throw new InvalidOperationException();
 
-         }
 
-         protected internal void Load()
 
-         {
 
-             reference.Retain();
 
-             Add(this);
 
-             if (status != LoadableStatus.Wait) return;
 
-             Logger.I("Load {0} {1}.{2}", GetType().Name, Path.GetFileName(pathOrURL), UnityEngine.Random.Range(0, int.MaxValue));
 
-             status = LoadableStatus.Loading;
 
-             progress = 0;
 
-             OnLoad();
 
-         }
 
-         protected internal void Unload()
 
-         {
 
-             if (status == LoadableStatus.Unloaded) return;
 
-             Logger.I("Unload {0} {1}.{2} {3}", GetType().Name, Path.GetFileName(pathOrURL), error, UnityEngine.Random.Range(0, int.MaxValue));
 
-             OnUnload();
 
-             status = LoadableStatus.Unloaded;
 
-         }
 
-         public void Release()
 
-         {
 
-             if (reference.count <= 0)
 
-             {
 
-                 Logger.W("Release {0} {1}.", GetType().Name, Path.GetFileName(pathOrURL));
 
-                 return;
 
-             }
 
-             reference.Release();
 
-             if (!reference.unused) return;
 
-             OnUnused();
 
-         }
 
-         protected virtual void OnUnused()
 
-         {
 
-         }
 
-     }
 
- }
 
 
  |