| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 | 
							- using System.Collections.Generic;
 
- using Fort23.Core;
 
- using Fort23.UTool;
 
- using UnityEngine;
 
- using Utility;
 
- namespace Core.AssetLoadTool.Asset
 
- {
 
-     public class BundleLoadBasic : LoadTaskBasic
 
-     {
 
-         public List<LoadTaskBasic> ownTask = new List<LoadTaskBasic>();
 
-         protected string url;
 
-         private float progress;
 
-         protected object userData;
 
-         private Map<string, LoadInfoAsset> _bundleAsset = new Map<string, LoadInfoAsset>();
 
-         public AssetBundle currBundle
 
-         {
 
-             get { return _currBundle; }
 
-         }
 
-         protected AssetBundle _currBundle;
 
-         protected System.Action<BundleLoadBasic, object> callBack;
 
-         protected List<BundleLoadBasic> m_dependenceTasks = new List<BundleLoadBasic>();
 
-         protected bool isAwaitDependencies;
 
-         protected bool _isUnloadType;
 
-         public string bundleName;
 
-         public void InitBundle(string bundleName, bool isUnloadType, System.Action<BundleLoadBasic, object> callBack)
 
-         {
 
-             // Debug.Log("加载bunlde"+bundleName);
 
-             _isUnloadType = isUnloadType;
 
-             loadState = LoadState.Init;
 
-             AddCallBack(callBack);
 
-             this.bundleName = bundleName;
 
-             LoadDependencies(bundleName);
 
-         }
 
-         public bool IsRepeat(string bundleName)
 
-         {
 
-             for (int i = 0; i < m_dependenceTasks.Count; i++)
 
-             {
 
-                 BundleLoadBasic bundleLoadBasic = m_dependenceTasks[i];
 
-                 if (bundleLoadBasic.bundleName == bundleName)
 
-                 {
 
-                     return true;
 
-                 }
 
-                 else
 
-                 {
 
-                     bool isRepeat = bundleLoadBasic.IsRepeat(bundleName);
 
-                     if (isRepeat)
 
-                     {
 
-                         return true;
 
-                     }
 
-                 }
 
-             }
 
-             return false;
 
-         }
 
-         public void LoadDependencies(string bundleName)
 
-         {
 
-             string[] dependencies = AssetBundleLoadManager.Instance.GetBundleDependencies(bundleName);
 
-             if (dependencies != null && dependencies.Length > 0)
 
-             {
 
-                 m_dependenceTasks = new List<BundleLoadBasic>();
 
-                 for (int i = 0; i < dependencies.Length; i++)
 
-                 {
 
-                     string depBundleName = dependencies[i];
 
-                     BundleLoadBasic task = AssetBundleLoadManager.Instance.AddBundleTask(depBundleName, null, this);
 
-                     if (task.IsRepeat(bundleName))
 
-                     {
 
-                         LogTool.Error("重复加载依赖包" + depBundleName + "  " + bundleName);
 
-                         continue;
 
-                     }
 
-                     m_dependenceTasks.Add(task);
 
-                 }
 
-                 isAwaitDependencies = true;
 
-                 loadState = LoadState.Await;
 
-                 AssetBundleLoadManager.Instance.dependenciesBuffer.Add(this);
 
-             }
 
-             else
 
-             {
 
-                 loadState = LoadState.Load;
 
-                 StartLoad();
 
-             }
 
-         }
 
-         public bool AwaitDependenceLoadEnd()
 
-         {
 
-             for (int i = 0; i < m_dependenceTasks.Count; i++)
 
-             {
 
-                 if (!m_dependenceTasks[i].IsLoadEnd())
 
-                 {
 
-                     return false;
 
-                 }
 
-             }
 
-             AwaitDependenciesFinish();
 
-             return true;
 
-         }
 
-         protected void AwaitDependenciesFinish()
 
-         {
 
-             isAwaitDependencies = false;
 
-             if (loadState == LoadState.Await)
 
-             {
 
-                 // loadState = LoadState.End;
 
-                 // callBack?.Invoke(this, userData);
 
-                 loadState = LoadState.Load;
 
-                 StartLoad();
 
-             }
 
-         }
 
-         protected void LoadFinish(AssetBundle assetBundle)
 
-         {
 
-             _currBundle = assetBundle;
 
-             if (_currBundle == null)
 
-             {
 
-                 LogTool.Error("budnle空的" + url + "__" + bundleName);
 
-                 return;
 
-             }
 
-             // if (isAwaitDependencies)
 
-             // {
 
-             //     loadState = LoadState.Await;
 
-             // }
 
-             // else
 
-             {
 
-                 loadState = LoadState.End;
 
-                 callBack?.Invoke(this, userData);
 
-             }
 
-         }
 
-         public void AddCallBack(System.Action<BundleLoadBasic, object> callBack)
 
-         {
 
-             if (loadState == LoadState.End)
 
-             {
 
-                 if (callBack != null)
 
-                 {
 
-                     callBack(this, userData);
 
-                 }
 
-                 return;
 
-             }
 
-             this.callBack += callBack;
 
-         }
 
-         public void AddOwnTask(LoadTaskBasic taskBasic)
 
-         {
 
-             if (taskBasic == null)
 
-             {
 
-                 return;
 
-             }
 
-             if (ownTask.Contains(taskBasic))
 
-             {
 
-                 return;
 
-             }
 
-             ownTask.Add(taskBasic);
 
-         }
 
-         public void RemoveAsset(string assetName)
 
-         {
 
-             if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))
 
-             {
 
-                 loadInfoAsset.count--;
 
-             }
 
-         }
 
-         public async CTask<T> LoadAsset<T>(string assetName) where T : Object
 
-         {
 
-             if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))
 
-             {
 
-                 loadInfoAsset.count++;
 
-                 if (loadInfoAsset.asset == null)
 
-                 {
 
-                     _bundleAsset.Remove(assetName);
 
-                 }
 
-                 else
 
-                 {
 
-                     return (T)loadInfoAsset.asset;
 
-                 }
 
-             }
 
-             if (_currBundle == null)
 
-             {
 
-                 LogTool.Error("budnle已经空" + url + "__" + bundleName);
 
-                 return default;
 
-             }
 
-             using (await CoroutineLockComponent.Instance.Wait(assetName))
 
-             {
 
-                 if (_bundleAsset.TryGetValue(assetName, out loadInfoAsset))
 
-                 {
 
-                     return (T)loadInfoAsset.asset;
 
-                 }
 
-                 CTask cTask = CTask.Create(false);
 
-                 loadInfoAsset = new LoadInfoAsset();
 
-                 AssetBundleRequest assetBundleRequest = _currBundle.LoadAssetAsync<T>(assetName);
 
-                 assetBundleRequest.completed += delegate(AsyncOperation obj)
 
-                 {
 
-                     loadInfoAsset.asset = assetBundleRequest.asset;
 
-                     loadInfoAsset.count = 1;
 
-                     _bundleAsset.Add(assetName, loadInfoAsset);
 
-                     cTask.SetResult();
 
-                 };
 
-                 // loadInfoAsset.asset = _currBundle.LoadAsset<T>(assetName);
 
-                 // loadInfoAsset.count = 1;
 
-                 await cTask;
 
-             }
 
-             return (T)loadInfoAsset.asset;
 
-         }
 
-         public void RemoveOwnTask(LoadTaskBasic taskBasic)
 
-         {
 
-             ownTask.Remove(taskBasic);
 
-             UnloadBundle();
 
-         }
 
-         public void UnloadBundle()
 
-         {
 
-             if (ownTask.Count <= 0)
 
-             {
 
-                 Dispose();
 
-             }
 
-         }
 
-         private void Dispose()
 
-         {
 
-             if (loadState == LoadState.Load)
 
-             {
 
-                 return;
 
-             }
 
-             for (_bundleAsset.Begin(); _bundleAsset.Next();)
 
-             {
 
-                 if (_bundleAsset.Value.asset is GameObject)
 
-                 {
 
-                     Object.DestroyImmediate(_bundleAsset.Value.asset, true);
 
-                 }
 
-                 else
 
-                 {
 
-                     Resources.UnloadAsset(_bundleAsset.Value.asset);
 
-                 }
 
-             }
 
-             _bundleAsset.Clear();
 
-             for (int i = 0; i < m_dependenceTasks.Count; i++)
 
-             {
 
-                 m_dependenceTasks[i].RemoveOwnTask(this);
 
-             }
 
-             m_dependenceTasks.Clear();
 
-             if (_currBundle != null)
 
-             {
 
-                 // Debug.Log("卸载bunlde"+bundleName);
 
-                 _currBundle.Unload(_isUnloadType);
 
-                 _currBundle = null;
 
-             }
 
-             AssetBundleLoadManager.Instance.RemoveBundleTask(this);
 
-             loadState = LoadState.Disposed;
 
-         }
 
-     }
 
- }
 
 
  |