123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using Object = UnityEngine.Object;
- namespace VEngine
- {
- public class Asset : Loadable, IEnumerator
- {
- public static readonly Dictionary<string, Asset> Cache = new Dictionary<string, Asset>();
- public static readonly Dictionary<string, int> CacheCount = new Dictionary<string, int>();
- public static readonly List<Asset> Unused = new List<Asset>();
- public Action<Asset> completed;
- public Object asset { get; protected set; }
- protected Type type { get; set; }
- public bool MoveNext()
- {
- return !isDone;
- }
- public void Reset()
- {
- }
- protected void OnLoaded(Object target)
- {
- asset = target;
- Finish(asset == null ? "asset == null" : null);
- }
- public object Current => null;
- public T Get<T>() where T : Object
- {
- return asset as T;
- }
- protected override void OnComplete()
- {
- if (completed == null) return;
- var saved = completed;
- if (completed != null) completed(this);
- completed -= saved;
- }
- protected override void OnUnused()
- {
- completed = null;
- Unused.Add(this);
- }
- public static Asset LoadAsync(string path, Type type, Action<Asset> completed = null)
- {
- return LoadInternal(path, type, false, completed);
- }
- public static Asset Load(string path, Type type)
- {
- return LoadInternal(path, type, true);
- }
- internal static Asset LoadInternal(string path, Type type, bool mustCompleteOnNextFrame,
- Action<Asset> completed = null)
- {
- if (!Versions.Contains(path))
- {
- Logger.W("请添加资源 {0}", path);
- return null;
- }
- if (!Cache.TryGetValue(path, out var item))
- {
- item = Versions.CreateAsset(path, type);
- Cache.Add(path, item);
- }
- // if (CacheCount.ContainsKey(path))
- // {
- // CacheCount[path] = CacheCount[path] + 1;
- // }
- // else
- // {
- // CacheCount.Add(path, 1);
- // }
- if (completed != null) item.completed += completed;
- item.mustCompleteOnNextFrame = mustCompleteOnNextFrame;
- item.Load();
- if (mustCompleteOnNextFrame) item.LoadImmediate();
- return item;
- }
- public static void UpdateAssets()
- {
- 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.pathOrURL);
- }
- }
- }
- }
|