DressUpLayerOperation.cs 10 KB

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