HeroDetailPanel.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. using System.Collections.Generic;
  2. using Animancer;
  3. using Animancer.TransitionLibraries;
  4. using Common.Utility.CombatEvent;
  5. using Core.Language;
  6. using Core.Utility;
  7. using Excel2Json;
  8. using Fort23.Core;
  9. using Fort23.UTool;
  10. using GameLogic.Bag;
  11. using GameLogic.Hero;
  12. using UnityEngine;
  13. using UnityEngine.AI;
  14. using UnityEngine.UI;
  15. using Utility;
  16. namespace Fort23.Mono
  17. {
  18. [UIBinding(prefab = "HeroDetailPanel" )]
  19. public partial class HeroDetailPanel : UIPanel
  20. {
  21. private HeroInfo heroInfo;
  22. private void Init()
  23. {
  24. // InitHeroDetailPanel();
  25. }
  26. protected override void AddEvent()
  27. {
  28. }
  29. protected override void DelEvent()
  30. {
  31. }
  32. public override void AddButtonEvent()
  33. {
  34. btnBack.onClick.AddListener(OnClickClose);
  35. btnUpgrade.onClick.AddListener(OnClickUpgrade);
  36. btnPromote.onClick.AddListener(OnClickPromote);
  37. btnSkill.onClick.AddListener(OnClickSkill);
  38. }
  39. public SkillUIComponent skillUIComponent;
  40. private async void OnClickSkill()
  41. {
  42. skillUIComponent = await UIManager.Instance.CreateGComponent<SkillUIComponent>(null, poolName:"SkillUIComponent",
  43. root:transform);
  44. skillUIComponent.InitUI(heroInfo);
  45. }
  46. private async void OnClickPromote()
  47. {
  48. if (PlayerManager.Instance.gameConstantConfig.maxStar <= heroInfo.star.Value)
  49. {
  50. LogTool.Log("已到达最高星级:" + PlayerManager.Instance.gameConstantConfig.maxStar);
  51. return;
  52. }
  53. if (isOpenPre)
  54. {
  55. //if (BagController.Instance.DeductItem(heroInfo.modelConfig.itemID, heroInfo.promoteConfig.costCount))
  56. {
  57. heroInfo.Promote();
  58. PlayerManager.Instance.SaveHeroData(heroInfo);
  59. UpdateAttributeUI();
  60. HeroUITools.SetStarShow(stars, heroInfo.star.Value);
  61. // LayoutRebuilder.ForceRebuildLayoutImmediate(StarsLayout.GetComponent<RectTransform>());
  62. SendEvent(HeroUpType.Promote);
  63. // FlyOutEft(upPre.Stars2);
  64. ExitPowerUpPre(curPreTyp, upPre.Stars2);
  65. }
  66. }
  67. else
  68. {
  69. await UIManager.Instance.CreateGComponentForObject<HeroPowerUpPre>(objHeroPowerUpPre, Callback, root: rtBottom);
  70. }
  71. }
  72. private async void Callback(HeroPowerUpPre pre)
  73. {
  74. upPre = pre;
  75. pre.OpenPromotePre(heroInfo);
  76. EnterPowerUpPre(2);
  77. }
  78. /// <summary>
  79. /// 是否打开了升级/升星的预览界面
  80. /// </summary>
  81. public bool isOpenPre;
  82. private byte curPreTyp;
  83. private async void OnClickUpgrade()
  84. {
  85. HeroUpResultType resultType = PlayerManager.Instance.heroController.UpgradeHeroLogic(heroInfo, isOpenPre);
  86. if (resultType == HeroUpResultType.Success)
  87. {
  88. UpdateAttributeUI();
  89. }
  90. else if (resultType == HeroUpResultType.PlayUpgradeEftFirst)
  91. {
  92. //TODO 要播放特效.
  93. ExitPowerUpPre(1);
  94. UpdateAttributeUI();
  95. }
  96. else if(resultType == HeroUpResultType.NeedOpenPreUI)
  97. {
  98. upPre = await UIManager.Instance.CreateGComponentForObject<HeroPowerUpPre>(objHeroPowerUpPre,
  99. delegate(HeroPowerUpPre pre)
  100. {
  101. EnterPowerUpPre(1);
  102. pre.OpenUpgradePre(heroInfo);
  103. }, root: rtBottom);
  104. }
  105. }
  106. private List<SimpleMove> simpleMoves = new List<SimpleMove>();
  107. private async void FlyInEft()
  108. {
  109. simpleMoves.Clear();
  110. upPre.Stars1Obj.SetActive(false);
  111. upPre.Stars2Obj.SetActive(false);
  112. await TimerComponent.Instance.WaitAsync(200);
  113. for (int i = 0; i < stars.Count; i++)
  114. {
  115. GameObject targetGo = upPre.Stars1[i] as GameObject;
  116. GameObject startGo = stars[i] as GameObject;
  117. RectTransform targetRT = targetGo.GetComponent<RectTransform>();
  118. RectTransform startRT = startGo.GetComponent<RectTransform>();
  119. SimpleMove sm = new SimpleMove(targetRT, startRT.position, targetRT.position);
  120. simpleMoves.Add(sm);
  121. }
  122. //把现在的星星隐藏了.
  123. StarsObj.SetActive(false);
  124. upPre.Stars1Obj.SetActive(true);
  125. int j = 0;
  126. float delayTime = 0;
  127. foreach (SimpleMove move in simpleMoves)
  128. {
  129. delayTime = (j++ * 0.05f);
  130. move.Start(delayTime);
  131. }
  132. await TimerComponent.Instance.WaitAsync(Mathf.RoundToInt((delayTime + 0.3f) * 1000));
  133. upPre.Stars2Obj.SetActive(true);
  134. }
  135. private async void FlyOutEft(List<object> startList)
  136. {
  137. int i = 0;
  138. // LayoutRebuilder.MarkLayoutForRebuild(StarsLayout.GetComponent<RectTransform>());
  139. // LayoutUtility.Layout(stars, LayoutType.Horizontal);
  140. simpleMoves.Clear();
  141. foreach (var star in stars)
  142. {
  143. GameObject targetGo = star as GameObject;
  144. GameObject startGo = startList[i++] as GameObject;
  145. //目标
  146. RectTransform targetRT = targetGo.GetComponent<RectTransform>();
  147. //起始
  148. RectTransform startRT = startGo.GetComponent<RectTransform>();
  149. SimpleMove sm = new SimpleMove(targetRT, startRT.position, targetRT.position);
  150. simpleMoves.Add(sm);
  151. }
  152. StarsObj.SetActive(true);
  153. int j = 0;
  154. float delayTime = 0f;
  155. foreach (SimpleMove move in simpleMoves)
  156. {
  157. delayTime = (j++ * 0.05f);
  158. move.Start(delayTime);
  159. }
  160. await TimerComponent.Instance.WaitAsync(Mathf.RoundToInt((delayTime + 0.3f) * 1000));
  161. // upPre.Stars2Layout.gameObject.SetActive(false);
  162. }
  163. /// <summary>
  164. /// 进入 升级/升星预览界面
  165. /// </summary>
  166. /// <param name="preTyp">1升级;2 升星</param>
  167. private void EnterPowerUpPre(byte preTyp)
  168. {
  169. isOpenPre = true;
  170. curPreTyp = preTyp;
  171. btns1.SetActive(false);
  172. if (preTyp == 1)
  173. {
  174. btnPromote.gameObject.SetActive(false);
  175. RectTransform rt = btnUpgrade.GetComponent<RectTransform>();
  176. rt.sizeDelta = new Vector2(510, rt.sizeDelta.y);
  177. rt.localPosition = new Vector3(47, rt.localPosition.y, rt.localPosition.z);
  178. }
  179. else
  180. {
  181. btnUpgrade.gameObject.SetActive(false);
  182. RectTransform rt = btnPromote.GetComponent<RectTransform>();
  183. rt.sizeDelta = new Vector2(510, rt.sizeDelta.y);
  184. rt.localPosition = new Vector3(47, rt.localPosition.y, rt.localPosition.z);
  185. FlyInEft();
  186. if (costHeroCount > curHeroCount)
  187. {
  188. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  189. }
  190. else
  191. {
  192. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Green";
  193. }
  194. }
  195. }
  196. /// <summary>
  197. /// 离开 升级/升星预览界面
  198. /// </summary>
  199. /// <param name="preTyp">1升级;2 升星</param>
  200. private void ExitPowerUpPre(byte preTyp, List<object> list = null)
  201. {
  202. isOpenPre = false;
  203. btns1.SetActive(true);
  204. // upPre.Stars1Layout.enabled = true;
  205. // upPre.Stars2Layout.enabled = true;
  206. if (preTyp == 1)
  207. {
  208. btnPromote.gameObject.SetActive(true);
  209. RectTransform rt = btnUpgrade.GetComponent<RectTransform>();
  210. rt.sizeDelta = new Vector2(400, rt.sizeDelta.y);
  211. rt.localPosition = new Vector3(163f, rt.localPosition.y, rt.localPosition.z);
  212. }
  213. else
  214. {
  215. FlyOutEft(list);
  216. btnUpgrade.gameObject.SetActive(true);
  217. RectTransform rt = btnPromote.GetComponent<RectTransform>();
  218. rt.sizeDelta = new Vector2(180, rt.sizeDelta.y);
  219. rt.localPosition = new Vector3(-135f, rt.localPosition.y, rt.localPosition.z);
  220. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Green";
  221. }
  222. objHeroPowerUpPre.SetActive(false);
  223. }
  224. /// <summary>
  225. /// 发送英雄提升的事件
  226. /// </summary>
  227. /// <param name="upType">提升类型:升级、升星等.</param>
  228. private void SendEvent(HeroUpType upType)
  229. {
  230. HeroPowerUpEventData data = new HeroPowerUpEventData();
  231. data.heroModelID = heroInfo.modelID;
  232. data.upType = upType;
  233. PlayerManager.Instance.lastHeroInfo = heroInfo;
  234. EventManager.Instance.Dispatch(CustomEventType.HeroPowerUp, data);
  235. if (upType == HeroUpType.Level)
  236. {
  237. EventManager.Instance.Dispatch(CustomEventType.HeroLvUp, data);
  238. }
  239. else if (upType == HeroUpType.Promote)
  240. {
  241. EventManager.Instance.Dispatch(CustomEventType.HeroPromote, data);
  242. }
  243. }
  244. private void OnClickClose()
  245. {
  246. if (isOpenPre)
  247. {
  248. ExitPowerUpPre(curPreTyp, upPre.Stars1);
  249. }
  250. else
  251. {
  252. UIManager.Instance.HideUIUIPanel(this);
  253. GObjectPool.Instance.Recycle(modelObj);
  254. }
  255. }
  256. private GameObjectPool modelObj;
  257. HeroPowerUpPre upPre;
  258. public async void InitHeroDetailPanel(HeroInfo heroInfo)
  259. {
  260. this.heroInfo = heroInfo;
  261. btns1.SetActive(true);
  262. objHeroPowerUpPre.SetActive(false);
  263. iconZhiYe.icon_name = heroInfo.iconZhiYe;
  264. heroName.text = LanguageManager.Instance.Text(heroInfo.modelConfig.name);
  265. // LayoutRebuilder.MarkLayoutForRebuild(StarsLayout.transform.GetComponent<RectTransform>());
  266. // StarsLayout.gameObject.SetActive(true);
  267. HeroUITools.SetStarShow(stars, heroInfo.star.Value);
  268. // StarsLayout.enabled = true;
  269. // StarsLayout.SetLayoutHorizontal();
  270. // await TimerComponent.Instance.WaitAsync(1);
  271. // StarsLayout.enabled = false;
  272. // await TimerComponent.Instance.WaitAsync(50);
  273. // StarsLayout.GetComponent<LayoutGroup>().s
  274. // StarsLayout.GetComponent<LayoutGroup>().SetDirty();
  275. // LayoutRebuilder.ForceRebuildLayoutImmediate(StarsLayout.GetComponent<RectTransform>());
  276. // GameObjectPool poolInterface =
  277. // await GObjectPool.Instance.FetchAsync<GameObjectPool>(heroInfo.modelConfig.model + ".prefab", null);
  278. modelObj = await GObjectPool.Instance.FetchAsync<GameObjectPool>(heroInfo.modelConfig.model + ".prefab",
  279. delegate(GameObjectPool pool)
  280. {
  281. pool.own.GetComponent<NavMeshAgent>().enabled = false;
  282. pool.own.transform.parent = ModelPos;
  283. pool.own.transform.localEulerAngles = new Vector3(0, 180, 0);
  284. pool.own.transform.localPosition = new Vector3(0, 0.2f, 0);
  285. pool.own.transform.localScale = Vector3.one;
  286. AnimancerComponent animancerComponent = pool.own.GetComponent<AnimancerComponent>();
  287. int max = animancerComponent.Transitions.Library.Count;
  288. for (int i = 0; i < max; i++)
  289. {
  290. if (animancerComponent.Transitions.Library.TryGetTransition(i,
  291. out TransitionModifierGroup transition))
  292. {
  293. TransitionAsset clipTransition2 = transition.Transition as TransitionAsset;
  294. if (clipTransition2 != null && clipTransition2.name == "idle")
  295. {
  296. animancerComponent.Play(clipTransition2);
  297. break;
  298. }
  299. }
  300. }
  301. HeroUITools.ChangeLayerRecursively(pool.own, LayerMask.NameToLayer("UI"));
  302. });
  303. switch (heroInfo.modelConfig.rarity)
  304. {
  305. case 1:
  306. heroRarity.text = LanguageManager.Instance.Text(32);
  307. break;
  308. case 2:
  309. heroRarity.text = LanguageManager.Instance.Text(31);
  310. break;
  311. case 3:
  312. heroRarity.text = LanguageManager.Instance.Text(30);
  313. break;
  314. default:
  315. LogTool.Error("找不到hero的稀有度:" + heroInfo.modelConfig.ID);
  316. break;
  317. }
  318. UpdateAttributeUI(true);
  319. }
  320. private long curHeroCount;
  321. private long costHeroCount;
  322. public async void UpdateAttributeUI(bool isInit = false)
  323. {
  324. StarsObj.SetActive(true);
  325. if (txtHP.text != heroInfo.hp.Value.ToStringEx())
  326. {
  327. long old = long.Parse(txtHP.text);
  328. txtHP.text = heroInfo.hp.Value.ToStringEx();
  329. if(!isInit)
  330. await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  331. {
  332. heroUpTxtEft.txtEft.text = "+" + (heroInfo.hp.Value - old).ToStringEx();
  333. },
  334. poolName: "HeroUpTxtEft", root: eftNumPos[0] as RectTransform);
  335. }
  336. if (txtATK.text != heroInfo.attack.Value.ToStringEx())
  337. {
  338. long old = long.Parse(txtATK.text);
  339. txtATK.text = heroInfo.attack.Value.ToStringEx();
  340. if(!isInit)
  341. await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  342. {
  343. heroUpTxtEft.txtEft.text = "+" + (heroInfo.attack.Value - old).ToStringEx();
  344. },
  345. poolName: "HeroUpTxtEft", root: eftNumPos[1] as RectTransform);
  346. }
  347. if (txtDEF.text != heroInfo.defense.Value.ToStringEx())
  348. {
  349. long old = long.Parse(txtDEF.text);
  350. txtDEF.text = heroInfo.defense.Value.ToStringEx();
  351. if(!isInit)
  352. await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  353. {
  354. heroUpTxtEft.txtEft.text = "+" + (heroInfo.defense.Value - old).ToStringEx();
  355. },
  356. poolName: "HeroUpTxtEft", root: eftNumPos[2] as RectTransform);
  357. }
  358. if (txtSHANBI.text != heroInfo.shanbi.Value.ToStringEx())
  359. {
  360. txtSHANBI.text = heroInfo.shanbi.Value.ToStringEx();
  361. if(!isInit)
  362. await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(null,
  363. poolName: "HeroUpTxtEft", root: eftNumPos[3] as RectTransform);
  364. }
  365. txtLv.text = heroInfo.level.Value.ToStringEx();
  366. txtExpGain.text = heroInfo.expGain.Value.ToStringEx();
  367. string redColorStar = "";
  368. string redColorEnd = "";
  369. long curExp = BagController.Instance.GetItemInfo(GlobalParam.Item_HeroExp_ID).count.Value;
  370. long costExp = heroInfo.powerUpConfig.levelUpExp;
  371. if (costExp > curExp)
  372. {
  373. redColorStar = "<color=#FF4C4C>";
  374. redColorEnd = "</color>";
  375. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  376. }
  377. else
  378. {
  379. redColorStar = "";
  380. redColorEnd = "";
  381. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Green";
  382. }
  383. txtUpgrade.text = redColorStar + curExp.ToStringEx() + redColorEnd + "/" + costExp.ToStringEx();
  384. curHeroCount = BagController.Instance.GetItemInfo(heroInfo.modelConfig.itemID).count.Value;
  385. costHeroCount = heroInfo.promoteConfig.costCount;
  386. if (costHeroCount > curHeroCount)
  387. {
  388. redColorStar = "<color=#FF4C4C>";
  389. redColorEnd = "</color>";
  390. }
  391. else
  392. {
  393. redColorStar = "";
  394. redColorEnd = "";
  395. }
  396. txtPromote.text = redColorStar + curHeroCount + redColorEnd + "/" + costHeroCount;
  397. // LogTool.Log(PlayerManager.Instance.heroController.CanUpgrade(heroInfo));
  398. // LogTool.Log(go1.activeSelf);
  399. if (PlayerManager.Instance.heroController.CanUpgrade(heroInfo) == HeroUpResultType.MainLevelNotEnough)
  400. {
  401. go1.SetActive(false);
  402. txtUpLimit.gameObject.SetActive(true);
  403. txtUpLimit.text = LanguageManager.Instance.Text(63);
  404. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  405. }
  406. else
  407. {
  408. go1.SetActive(true);
  409. txtUpLimit.gameObject.SetActive(false);
  410. // btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Green";
  411. }
  412. }
  413. }
  414. }