BundleLoadBasic.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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 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. loadInfoAsset = new LoadInfoAsset();
  148. loadInfoAsset.asset = _currBundle.LoadAsset<T>(assetName);
  149. loadInfoAsset.count = 1;
  150. _bundleAsset.Add(assetName, loadInfoAsset);
  151. return (T)loadInfoAsset.asset;
  152. }
  153. public void RemoveOwnTask(LoadTaskBasic taskBasic)
  154. {
  155. ownTask.Remove(taskBasic);
  156. UnloadBundle();
  157. }
  158. public void UnloadBundle()
  159. {
  160. if (ownTask.Count <= 0)
  161. {
  162. Dispose();
  163. }
  164. }
  165. private void Dispose()
  166. {
  167. if (loadState == LoadState.Load)
  168. {
  169. return;
  170. }
  171. for (_bundleAsset.Begin(); _bundleAsset.Next();)
  172. {
  173. if (_bundleAsset.Value.asset is GameObject)
  174. {
  175. Object.DestroyImmediate(_bundleAsset.Value.asset, true);
  176. }
  177. else
  178. {
  179. Resources.UnloadAsset(_bundleAsset.Value.asset);
  180. }
  181. }
  182. _bundleAsset.Clear();
  183. for (int i = 0; i < m_dependenceTasks.Count; i++)
  184. {
  185. m_dependenceTasks[i].RemoveOwnTask(this);
  186. }
  187. m_dependenceTasks.Clear();
  188. if (_currBundle != null)
  189. {
  190. // Debug.Log("卸载bunlde"+bundleName);
  191. _currBundle.Unload(_isUnloadType);
  192. _currBundle = null;
  193. }
  194. AssetBundleLoadManager.Instance.RemoveBundleTask(this);
  195. loadState = LoadState.Disposed;
  196. }
  197. }
  198. }