DressUpLayerOperation.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using ET;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using YooAsset;
  5. namespace GFGGame
  6. {
  7. public class DressUpLayerOperation : DressUpOperationBase
  8. {
  9. private enum EAction
  10. {
  11. Layer,
  12. Body,
  13. Head
  14. }
  15. public const int PRE_RENDER_FRAME = 1;
  16. private ItemCfg itemCfg;
  17. private GameObject parentObj;
  18. private int layerId;
  19. private bool needSetMask;
  20. private bool showAni;
  21. private string resPath;
  22. private string effectResPath;
  23. private int preRendering;
  24. private ResourceDownloaderOperation downloaderOperation;
  25. private EAction actionType;
  26. private List<GameObject> preloadList = new List<GameObject>();
  27. private string[] locationsLoading;
  28. public DressUpLayerOperation(GameObject parentObj, bool needSetMask, bool showAni, string resPath, string effectResPath)
  29. {
  30. this.parentObj = parentObj;
  31. this.needSetMask = needSetMask;
  32. this.resPath = resPath;
  33. this.effectResPath = effectResPath;
  34. this.showAni = showAni;
  35. preRendering = 0;
  36. }
  37. public void InitLayer(ItemCfg itemCfg, int layerId)
  38. {
  39. //Debug.Log($"InitLayer {itemCfg.id}");
  40. this.itemCfg = itemCfg;
  41. this.layerId = layerId;
  42. actionType = EAction.Layer;
  43. }
  44. public void InitBody()
  45. {
  46. //Debug.Log("InitBody");
  47. actionType = EAction.Body;
  48. }
  49. public void InitHead()
  50. {
  51. actionType = EAction.Head;
  52. }
  53. internal override bool CheckRepeated(DressUpOperationBase t)
  54. {
  55. var operation = t as DressUpLayerOperation;
  56. if (operation != null && operation.actionType == this.actionType)
  57. {
  58. if(actionType == EAction.Layer)
  59. {
  60. return (operation.parentObj == this.parentObj
  61. && operation.itemCfg == this.itemCfg
  62. && operation.layerId == this.layerId);
  63. }
  64. else
  65. {
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. /// <summary>
  72. /// 取消下载
  73. /// </summary>
  74. internal override void Cancel()
  75. {
  76. if (_steps != EDressUpSteps.Done)
  77. {
  78. if (downloaderOperation != null)
  79. {
  80. downloaderOperation.CancelDownload();
  81. }
  82. _steps = EDressUpSteps.Done;
  83. }
  84. Status = EOperationStatus.Failed;
  85. Error = "User cancel.";
  86. }
  87. internal override void UpdateView()
  88. {
  89. if (parentObj == null)
  90. {
  91. this.Release();
  92. return;
  93. }
  94. ViewManager.Hide<ModalStatusView>();
  95. TryFinishPreDraw();
  96. switch (actionType)
  97. {
  98. case EAction.Layer:
  99. UpdateLayer();
  100. break;
  101. case EAction.Body:
  102. UpdateBody();
  103. break;
  104. case EAction.Head:
  105. UpdateHead();
  106. break;
  107. default:
  108. break;
  109. }
  110. }
  111. internal override void Release()
  112. {
  113. TryFinishPreDraw();
  114. downloaderOperation = null;
  115. this.itemCfg = null;
  116. this.parentObj = null;
  117. locationsLoading = null;
  118. }
  119. internal override void Start()
  120. {
  121. _steps = EDressUpSteps.Check;
  122. Update();
  123. }
  124. internal override void Update()
  125. {
  126. if (_steps == EDressUpSteps.None || _steps == EDressUpSteps.Done)
  127. return;
  128. if (_steps == EDressUpSteps.Check)
  129. {
  130. CheckLoadRes();
  131. }
  132. if(_steps == EDressUpSteps.Loading)
  133. {
  134. Progress = downloaderOperation.Progress;
  135. if(downloaderOperation.IsDone)
  136. {
  137. if (downloaderOperation.Status == EOperationStatus.Succeed)
  138. {
  139. foreach (var t in locationsLoading)
  140. {
  141. LoadManager.Instance.SetResDownloaded(t);
  142. }
  143. CheckPreDraw();
  144. }
  145. else
  146. {
  147. _steps = EDressUpSteps.Done;
  148. Status = EOperationStatus.Failed;
  149. }
  150. }
  151. }
  152. if(_steps == EDressUpSteps.PreDrawing)
  153. {
  154. //Debug.Log($"preRendering {preRendering} {resPath} {TimeHelper.ClientNow()}");
  155. if(preRendering <= 0)
  156. {
  157. _steps = EDressUpSteps.Done;
  158. Status = EOperationStatus.Succeed;
  159. }
  160. preRendering--;
  161. }
  162. }
  163. private void CheckLoadRes()
  164. {
  165. List<string> locations = new List<string>();
  166. if(!string.IsNullOrEmpty(resPath) && !LoadManager.Instance.CheckResExsited(resPath))
  167. {
  168. //需加载
  169. locations.Add(this.resPath);
  170. }
  171. if(!string.IsNullOrEmpty(effectResPath) && !LoadManager.Instance.CheckResExsited(effectResPath))
  172. {
  173. //需加载
  174. locations.Add(effectResPath);
  175. }
  176. if(locations.Count == 0)
  177. {
  178. _steps = EDressUpSteps.Done;
  179. Status = EOperationStatus.Succeed;
  180. return;
  181. }
  182. locationsLoading = locations.ToArray();
  183. downloaderOperation = YooAssets.CreateBundleDownloader(locationsLoading, 3, 3);
  184. if(downloaderOperation.TotalDownloadCount == 0)
  185. {
  186. //文件已在本地,不需要下载
  187. CheckPreDraw();
  188. return;
  189. }
  190. ViewManager.Show<ModalStatusView>("加载中...");
  191. //下载
  192. _steps = EDressUpSteps.Loading;
  193. downloaderOperation.BeginDownload();
  194. }
  195. private void CheckPreDraw()
  196. {
  197. if(!string.IsNullOrEmpty(resPath))
  198. {
  199. if (showAni)
  200. {
  201. _steps = EDressUpSteps.PreDrawing;
  202. //设置预渲染帧数
  203. preRendering = PRE_RENDER_FRAME;
  204. //预渲染
  205. var t = Live2dAnimationManager.Instance.PreDraw(resPath);
  206. preloadList.Add(t);
  207. //Debug.Log($"PreDraw {resPath} {TimeHelper.ClientNow()}");
  208. return;
  209. }
  210. }
  211. _steps = EDressUpSteps.Done;
  212. Status = EOperationStatus.Succeed;
  213. }
  214. private void TryFinishPreDraw()
  215. {
  216. if(preloadList == null)
  217. {
  218. return;
  219. }
  220. foreach (var t in preloadList)
  221. {
  222. Live2dAnimationManager.Instance.FinishPreDrawed(t);
  223. }
  224. preloadList.Clear();
  225. preloadList = null;
  226. }
  227. private void UpdateLayer()
  228. {
  229. //Debug.Log($"UpdateLayer add {itemCfg.id}");
  230. //清理旧的
  231. var spritObjName = string.Format(DressUpUtil.FORMAT_SPRITE_NAME, itemCfg.subType, layerId);
  232. DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
  233. var aniObjName = string.Format(DressUpUtil.FORMAT_ANIMATION_NAME, itemCfg.subType, layerId);
  234. DressUpUtil.TryRemoveObj(parentObj, aniObjName);
  235. string effectObjName = string.Format(DressUpUtil.FORMAT_EFFECT_OBJ_NAME, itemCfg.subType, layerId);
  236. DressUpUtil.TryRemoveObj(parentObj, effectObjName);
  237. //添加新的
  238. int sortingOrder = ItemTypeCfgArray.Instance.GetSortingOrder(itemCfg.subType, layerId);
  239. if (this.showAni)
  240. {
  241. DressUpUtil.AddAnimationObj(resPath, aniObjName, parentObj, sortingOrder);
  242. }
  243. else
  244. {
  245. string ext = ItemUtil.GetItemResExt(itemCfg.itemType, itemCfg.subType);
  246. DressUpUtil.AddSpriteObj(resPath, spritObjName, parentObj, sortingOrder, needSetMask);
  247. }
  248. if (!string.IsNullOrEmpty(effectResPath))
  249. {
  250. DressUpUtil.TryAddEffectObj(effectResPath, effectObjName, parentObj, sortingOrder);
  251. }
  252. }
  253. private void UpdateBody()
  254. {
  255. var spritObjName = DressUpUtil.BODY_SPRITE_NAME;
  256. var aniObjName = DressUpUtil.BODY_ANIMATION_NAME;
  257. var effectObjName = DressUpUtil.BODY_EFFECT_OBJ_NAME;
  258. int sortingOrder = 0;
  259. var removeBodyAni = DressUpUtil.TryRemoveObj(parentObj, aniObjName);
  260. DressUpUtil.TryRemoveObj(parentObj, effectObjName);
  261. DressUpUtil.TryRemoveSprite(parentObj, spritObjName);
  262. if (this.showAni)
  263. {
  264. DressUpUtil.AddAnimationObj(this.resPath, aniObjName, parentObj, sortingOrder);
  265. }
  266. else
  267. {
  268. DressUpUtil.AddSpriteObj(this.resPath, spritObjName, parentObj, sortingOrder, needSetMask);
  269. if (removeBodyAni)
  270. {
  271. parentObj.transform.SetPositionAndRotation(new Vector3(), new Quaternion());
  272. }
  273. }
  274. if (!string.IsNullOrEmpty(effectResPath))
  275. {
  276. DressUpUtil.TryAddEffectObj(effectResPath, effectObjName, parentObj, sortingOrder);
  277. }
  278. }
  279. private void UpdateHead()
  280. {
  281. var spritObjName = DressUpUtil.HEAD_SPRITE_NAME;
  282. int sortingOrder = 1;
  283. Transform transform_t = parentObj.transform.Find(spritObjName);
  284. if (!string.IsNullOrEmpty(this.resPath))
  285. {
  286. if (transform_t != null)
  287. {
  288. transform_t.gameObject.SetActive(true);
  289. return;
  290. }
  291. DressUpUtil.AddSpriteObj(resPath, spritObjName, parentObj, sortingOrder, needSetMask);
  292. }
  293. else
  294. {
  295. if (transform_t == null)
  296. {
  297. return;
  298. }
  299. transform_t.gameObject.SetActive(false);
  300. }
  301. }
  302. }
  303. }