AssetLoadTaskBasic.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Core.AssetLoadTool.Asset;
  5. using Fort23.UTool;
  6. #if !COMBAT_SERVER
  7. using Fort23.Core;
  8. using UnityEngine;
  9. #endif
  10. using Utility;
  11. using Object = UnityEngine.Object;
  12. public class AssetLoadTaskBasic : LoadTaskBasic
  13. {
  14. #if !COMBAT_SERVER
  15. private List<LoadAssetCallBackData> loadEndCallBackData = new List<LoadAssetCallBackData>();
  16. private Object objAsset;
  17. private List<AssetHandle> _loadAssetHandles = new List<AssetHandle>();
  18. protected bool _isUnloadType;
  19. private int _callBackCount;
  20. public int HandCount
  21. {
  22. get { return _loadAssetHandles.Count; }
  23. }
  24. public void InitAsset<T>(AssetInfo bundleInfo, bool isUnloadType,
  25. LoadAssetCallBackData loadEndCallBack)
  26. where T : Object
  27. {
  28. _isUnloadType = isUnloadType;
  29. _assetInfo = bundleInfo;
  30. loadState = LoadState.Load;
  31. AddCallBack<T>(loadEndCallBack);
  32. StartLoadAsset<T>();
  33. }
  34. protected virtual void StartLoadAsset<T>() where T : Object
  35. {
  36. }
  37. public void LoadFinish<T>(Object objAsset)
  38. {
  39. this.objAsset = objAsset;
  40. LoadAsset<T>();
  41. }
  42. public void Dispose()
  43. {
  44. if (loadState == LoadState.Disposed)
  45. {
  46. return;
  47. }
  48. objAsset = null;
  49. loadEndCallBackData.Clear();
  50. if (AssetBundleLoadManager.Instance != null)
  51. {
  52. AssetBundleLoadManager.Instance.RemoveAssetTask(_assetInfo);
  53. }
  54. loadState = LoadState.Disposed;
  55. ProDispose();
  56. }
  57. protected virtual void ProDispose()
  58. {
  59. }
  60. public void RemoveAssetHandle(AssetHandle assetHandle)
  61. {
  62. _loadAssetHandles.Remove(assetHandle);
  63. if (_loadAssetHandles.Count <= 0 && _callBackCount <= 0)
  64. {
  65. Dispose();
  66. }
  67. }
  68. private void LoadAsset<T>()
  69. {
  70. if (loadEndCallBackData.Count <= 0 || objAsset == null)
  71. {
  72. if (objAsset == null)
  73. {
  74. LogTool.Error(ToString() + " " + _assetInfo.name + "资源没有了");
  75. }
  76. else
  77. {
  78. LogTool.Error(ToString() + " " + _assetInfo.name + " 回掉没有了");
  79. }
  80. return;
  81. }
  82. if (loadState != LoadState.Load)
  83. {
  84. LogTool.Error(_assetInfo.name + " 以释放不能在加载");
  85. return;
  86. }
  87. loadState = LoadState.End;
  88. LoadAssetCallBackData[] delegateArr = loadEndCallBackData.ToArray();
  89. _callBackCount = delegateArr.Length;
  90. for (int i = 0; i < delegateArr.Length; i++)
  91. {
  92. _callBackCount--;
  93. ExecutionCallBack<T>(delegateArr[i]);
  94. }
  95. loadEndCallBackData.Clear();
  96. _callBackCount = 0;
  97. }
  98. protected void ExecutionCallBack<T>(LoadAssetCallBackData loadAssetCallBackData)
  99. {
  100. // Debug.Log("加载资源"+_assetInfo.name);
  101. if (loadAssetCallBackData.Clock != null && loadAssetCallBackData.Clock.isBreak)
  102. {
  103. loadAssetCallBackData.loadEndCallBack?.Invoke(null, loadAssetCallBackData.userData);
  104. return;
  105. }
  106. InstantiateSync<T>(loadAssetCallBackData.loadEndCallBack, loadAssetCallBackData.userData,
  107. loadAssetCallBackData.isUseSynchronous);
  108. }
  109. public async CTask<AssetHandle> InstantiateSync(bool isUseSynchronous)
  110. {
  111. if (objAsset == null)
  112. {
  113. return null;
  114. }
  115. AssetHandle assetHandle = new AssetHandle();
  116. try
  117. {
  118. UnityEngine.Object go = objAsset;
  119. if ((go is GameObject)) //Prefab类型
  120. {
  121. // 异步unity目前有bug,先不要使用
  122. AsyncInstantiateOperation asyncInstantiateOperation = Object.InstantiateAsync<GameObject>(objAsset as GameObject);
  123. if (isUseSynchronous)
  124. {
  125. asyncInstantiateOperation.WaitForCompletion();
  126. }
  127. else
  128. {
  129. CTask cTask = CTask.Create(false);
  130. asyncInstantiateOperation.completed += delegate(AsyncOperation operation)
  131. {
  132. cTask.SetResult();
  133. };
  134. await cTask;
  135. }
  136. go = asyncInstantiateOperation.Result[0];
  137. if (!Application.isPlaying)
  138. {
  139. GameObject.DestroyImmediate(go);
  140. return null;
  141. }
  142. // go = Object.Instantiate(objAsset);
  143. // go.name = _assetInfo.name;
  144. }
  145. assetHandle.Init(this, go);
  146. _loadAssetHandles.Add(assetHandle);
  147. }
  148. catch (Exception e)
  149. {
  150. LogTool.Error("资源加载出问题" + _assetInfo.name + "___" + e.Message);
  151. LogTool.Error(e);
  152. }
  153. return assetHandle;
  154. }
  155. private async CTask InstantiateSync<T>(System.Action<AssetHandle, object> callBack, object userData,
  156. bool isUseSynchronous)
  157. {
  158. try
  159. {
  160. AssetHandle assetHandle = await InstantiateSync(isUseSynchronous);
  161. callBack(assetHandle, userData);
  162. }
  163. catch (System.Exception e)
  164. {
  165. LogTool.Error(_assetInfo.name + "_" + e);
  166. CallErrorBack();
  167. }
  168. }
  169. protected override void ProUpdate()
  170. {
  171. for (int i = 0; i < _loadAssetHandles.Count; i++)
  172. {
  173. bool isActivation = _loadAssetHandles[i].IsActivation();
  174. if (!isActivation)
  175. {
  176. _loadAssetHandles[i].Release();
  177. }
  178. }
  179. }
  180. public void AddCallBack<T>(LoadAssetCallBackData loadEndCallBack)
  181. {
  182. //LogTool.Log("assetAddCallBack" + assetName);
  183. if (loadState == LoadState.End)
  184. {
  185. ExecutionCallBack<T>(loadEndCallBack);
  186. return;
  187. }
  188. loadEndCallBackData.Add(loadEndCallBack);
  189. }
  190. protected void CallErrorBack()
  191. {
  192. for (int i = 0; i < loadEndCallBackData.Count; i++)
  193. {
  194. LoadAssetCallBackData loadAssetCallBackData = loadEndCallBackData[i];
  195. loadAssetCallBackData.loadEndCallBack?.Invoke(null, loadAssetCallBackData.userData);
  196. }
  197. _callBackCount = 0;
  198. loadEndCallBackData.Clear();
  199. }
  200. #endif
  201. }