BundleLoadBasic.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. using System.Collections.Generic;
  2. using Fort23.Core;
  3. using Fort23.UTool;
  4. using UnityEngine;
  5. using Utility;
  6. namespace Core.AssetLoadTool.Asset
  7. {
  8. public class BundleLoadBasic : LoadTaskBasic
  9. {
  10. public List<LoadTaskBasic> ownTask = new List<LoadTaskBasic>();
  11. protected string url;
  12. private float progress;
  13. protected object userData;
  14. private Map<string, LoadInfoAsset> _bundleAsset = new Map<string, LoadInfoAsset>();
  15. public AssetBundle currBundle
  16. {
  17. get { return _currBundle; }
  18. }
  19. protected AssetBundle _currBundle;
  20. protected System.Action<BundleLoadBasic, object> callBack;
  21. protected List<BundleLoadBasic> m_dependenceTasks = new List<BundleLoadBasic>();
  22. protected bool isAwaitDependencies;
  23. protected bool _isUnloadType;
  24. public string bundleName;
  25. public void InitBundle(string bundleName, bool isUnloadType, System.Action<BundleLoadBasic, object> callBack)
  26. {
  27. // Debug.Log("加载bunlde"+bundleName);
  28. _isUnloadType = isUnloadType;
  29. loadState = LoadState.Init;
  30. AddCallBack(callBack);
  31. this.bundleName = bundleName;
  32. LoadDependencies(bundleName);
  33. }
  34. public void LoadDependencies(string bundleName)
  35. {
  36. string[] dependencies = AssetBundleLoadManager.Instance.GetBundleDependencies(bundleName);
  37. if (dependencies != null && dependencies.Length > 0)
  38. {
  39. m_dependenceTasks = new List<BundleLoadBasic>();
  40. for (int i = 0; i < dependencies.Length; i++)
  41. {
  42. string depBundleName = dependencies[i];
  43. BundleLoadBasic task = AssetBundleLoadManager.Instance.AddBundleTask(depBundleName, null, this);
  44. m_dependenceTasks.Add(task);
  45. }
  46. isAwaitDependencies = true;
  47. loadState = LoadState.Await;
  48. AssetBundleLoadManager.Instance.dependenciesBuffer.Add(this);
  49. }
  50. else
  51. {
  52. loadState = LoadState.Load;
  53. StartLoad();
  54. }
  55. }
  56. public bool AwaitDependenceLoadEnd()
  57. {
  58. for (int i = 0; i < m_dependenceTasks.Count; i++)
  59. {
  60. if (!m_dependenceTasks[i].IsLoadEnd())
  61. {
  62. return false;
  63. }
  64. }
  65. AwaitDependenciesFinish();
  66. return true;
  67. }
  68. protected void AwaitDependenciesFinish()
  69. {
  70. isAwaitDependencies = false;
  71. if (loadState == LoadState.Await)
  72. {
  73. // loadState = LoadState.End;
  74. // callBack?.Invoke(this, userData);
  75. loadState = LoadState.Load;
  76. StartLoad();
  77. }
  78. }
  79. protected void LoadFinish(AssetBundle assetBundle)
  80. {
  81. _currBundle = assetBundle;
  82. if (_currBundle == null)
  83. {
  84. LogTool.Error("budnle空的" + url + "__" + bundleName);
  85. return;
  86. }
  87. // if (isAwaitDependencies)
  88. // {
  89. // loadState = LoadState.Await;
  90. // }
  91. // else
  92. {
  93. loadState = LoadState.End;
  94. callBack?.Invoke(this, userData);
  95. }
  96. }
  97. public void AddCallBack(System.Action<BundleLoadBasic, object> callBack)
  98. {
  99. if (loadState == LoadState.End)
  100. {
  101. if (callBack != null)
  102. {
  103. callBack(this, userData);
  104. }
  105. return;
  106. }
  107. this.callBack += callBack;
  108. }
  109. public void AddOwnTask(LoadTaskBasic taskBasic)
  110. {
  111. if (taskBasic == null)
  112. {
  113. return;
  114. }
  115. if (ownTask.Contains(taskBasic))
  116. {
  117. return;
  118. }
  119. ownTask.Add(taskBasic);
  120. }
  121. public void RemoveAsset(string assetName)
  122. {
  123. if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))
  124. {
  125. loadInfoAsset.count--;
  126. }
  127. }
  128. public async CTask<T> LoadAsset<T>(string assetName) where T : Object
  129. {
  130. if (_bundleAsset.TryGetValue(assetName, out LoadInfoAsset loadInfoAsset))
  131. {
  132. loadInfoAsset.count++;
  133. if (loadInfoAsset.asset == null)
  134. {
  135. _bundleAsset.Remove(assetName);
  136. }
  137. else
  138. {
  139. return (T)loadInfoAsset.asset;
  140. }
  141. }
  142. if (_currBundle == null)
  143. {
  144. LogTool.Error("budnle已经空" + url + "__" + bundleName);
  145. return default;
  146. }
  147. using (await CoroutineLockComponent.Instance.Wait(assetName))
  148. {
  149. if (_bundleAsset.TryGetValue(assetName, out loadInfoAsset))
  150. {
  151. return (T)loadInfoAsset.asset;
  152. }
  153. CTask cTask = CTask.Create(false);
  154. loadInfoAsset = new LoadInfoAsset();
  155. AssetBundleRequest assetBundleRequest= _currBundle.LoadAssetAsync(assetName);
  156. assetBundleRequest.completed += delegate(AsyncOperation obj)
  157. {
  158. loadInfoAsset.asset = assetBundleRequest.asset;
  159. loadInfoAsset.count = 1;
  160. _bundleAsset.Add(assetName, loadInfoAsset);
  161. cTask.SetResult();
  162. };
  163. // loadInfoAsset.asset = _currBundle.LoadAsset<T>(assetName);
  164. // loadInfoAsset.count = 1;
  165. await cTask;
  166. }
  167. return (T)loadInfoAsset.asset;
  168. }
  169. public void RemoveOwnTask(LoadTaskBasic taskBasic)
  170. {
  171. ownTask.Remove(taskBasic);
  172. UnloadBundle();
  173. }
  174. public void UnloadBundle()
  175. {
  176. if (ownTask.Count <= 0)
  177. {
  178. Dispose();
  179. }
  180. }
  181. private void Dispose()
  182. {
  183. if (loadState == LoadState.Load)
  184. {
  185. return;
  186. }
  187. for (_bundleAsset.Begin(); _bundleAsset.Next();)
  188. {
  189. if (_bundleAsset.Value.asset is GameObject)
  190. {
  191. Object.DestroyImmediate(_bundleAsset.Value.asset, true);
  192. }
  193. else
  194. {
  195. Resources.UnloadAsset(_bundleAsset.Value.asset);
  196. }
  197. }
  198. _bundleAsset.Clear();
  199. for (int i = 0; i < m_dependenceTasks.Count; i++)
  200. {
  201. m_dependenceTasks[i].RemoveOwnTask(this);
  202. }
  203. m_dependenceTasks.Clear();
  204. if (_currBundle != null)
  205. {
  206. // Debug.Log("卸载bunlde"+bundleName);
  207. _currBundle.Unload(_isUnloadType);
  208. _currBundle = null;
  209. }
  210. AssetBundleLoadManager.Instance.RemoveBundleTask(this);
  211. loadState = LoadState.Disposed;
  212. }
  213. }
  214. }