HeroDetailPanel.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  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 TMPro;
  13. using UnityEngine;
  14. using UnityEngine.AI;
  15. using UnityEngine.UI;
  16. using Utility;
  17. namespace Fort23.Mono
  18. {
  19. [UIBinding(prefab = "HeroDetailPanel" )]
  20. public partial class HeroDetailPanel : UIPanel
  21. {
  22. private HeroInfo heroInfo;
  23. private void Init()
  24. {
  25. // InitHeroDetailPanel();
  26. }
  27. protected override void AddEvent()
  28. {
  29. }
  30. protected override void DelEvent()
  31. {
  32. }
  33. public override void AddButtonEvent()
  34. {
  35. btnBack.onClick.AddListener(OnClickClose);
  36. btnUpgrade.onClick.AddListener(OnClickUpgrade);
  37. btnPromote.onClick.AddListener(OnClickPromote);
  38. btnSkill.onClick.AddListener(OnClickSkill);
  39. btnPrev.onClick.AddListener(OnclickPrevHero);
  40. btnNext.onClick.AddListener(OnclickNextHero);
  41. }
  42. private void OnclickPrevHero()
  43. {
  44. SwitchHero(false);
  45. }
  46. private void OnclickNextHero()
  47. {
  48. SwitchHero(true);
  49. }
  50. public void SwitchHero(bool isNext)
  51. {
  52. if (sourcePanel == UIPanelName.None)
  53. {
  54. LogTool.Error("打开英雄界面的上个一个UIPanel未知");
  55. return;
  56. }
  57. GObjectPool.Instance.Recycle(modelObj);
  58. if (sourcePanel == UIPanelName.BagPanel)
  59. {
  60. HeroBagPanel heroBagPanel = UIManager.Instance.GetComponent<HeroBagPanel>();
  61. WidgetHero widgetHero = HeroUITools.
  62. GetCloseHero(heroBagPanel.widgetHeroes, heroWidget, isNext);
  63. if (widgetHero != null)
  64. {
  65. InitHeroDetailPanel(widgetHero, sourcePanel);
  66. }
  67. }
  68. if (sourcePanel == UIPanelName.MainPanel)
  69. {
  70. MainUIPanel mainUIPanel = UIManager.Instance.GetComponent<MainUIPanel>();
  71. WidgetHero widgetHero = HeroUITools.
  72. GetCloseHero(mainUIPanel.widgetHeroes, heroWidget, isNext);
  73. if (widgetHero != null)
  74. {
  75. InitHeroDetailPanel(widgetHero, sourcePanel);
  76. }
  77. }
  78. }
  79. private bool IsShowArrow(bool isNext)
  80. {
  81. if (sourcePanel == UIPanelName.None)
  82. {
  83. return false;
  84. }
  85. if (sourcePanel == UIPanelName.BagPanel)
  86. {
  87. HeroBagPanel heroBagPanel = UIManager.Instance.GetComponent<HeroBagPanel>();
  88. WidgetHero widgetHero = HeroUITools.
  89. GetCloseHero(heroBagPanel.widgetHeroes, heroWidget, isNext);
  90. return widgetHero != null;
  91. }
  92. if (sourcePanel == UIPanelName.MainPanel)
  93. {
  94. MainUIPanel mainUIPanel = UIManager.Instance.GetComponent<MainUIPanel>();
  95. WidgetHero widgetHero = HeroUITools.
  96. GetCloseHero(mainUIPanel.widgetHeroes, heroWidget, isNext);
  97. return widgetHero != null;
  98. }
  99. return false;
  100. }
  101. public SkillUIComponent skillUIComponent;
  102. private async void OnClickSkill()
  103. {
  104. // skillUIComponent = await UIManager.Instance.CreateGComponent<SkillUIComponent>(null, poolName:"SkillUIComponent",
  105. // root:transform);
  106. skillUIComponent = await UIManager.Instance.
  107. CreateGComponentForObject<SkillUIComponent>(skillUI, null, isInstance : false, root:transform);
  108. skillUIComponent.InitUI(heroInfo);
  109. }
  110. private async void OnClickPromote()
  111. {
  112. if (PlayerManager.Instance.gameConstantConfig.maxStar <= heroInfo.star.Value)
  113. {
  114. LogTool.Log("已到达最高星级:" + PlayerManager.Instance.gameConstantConfig.maxStar);
  115. return;
  116. }
  117. if (isOpenPre)
  118. {
  119. heroInfo.Promote();
  120. PlayerManager.Instance.SaveHeroData(heroInfo);
  121. UpdateAttributeUI();
  122. HeroUITools.SetStarShow(stars, heroInfo.star.Value);
  123. PlayerManager.Instance.heroController.SendEvent(HeroUpType.Promote, heroInfo, HeroUpResultType.Success);
  124. ExitPowerUpPre(curPreTyp, upPre.Stars2);
  125. }
  126. else
  127. {
  128. await UIManager.Instance.CreateGComponentForObject<HeroPowerUpPre>(objHeroPowerUpPre, OpenPreUICallback, root: rtBottom);
  129. }
  130. }
  131. private async void OpenPreUICallback(HeroPowerUpPre pre)
  132. {
  133. upPre = pre;
  134. pre.OpenPromotePre(heroInfo);
  135. EnterPowerUpPre(2);
  136. }
  137. /// <summary>
  138. /// 是否打开了升级/升星的预览界面
  139. /// </summary>
  140. public bool isOpenPre;
  141. private byte curPreTyp;
  142. private async void OnClickUpgrade()
  143. {
  144. HeroUpResultType resultType = PlayerManager.Instance.heroController.UpgradeHeroLogic(heroInfo, isOpenPre);
  145. if (resultType == HeroUpResultType.Success)
  146. {
  147. UpdateAttributeUI();
  148. }
  149. else if (resultType == HeroUpResultType.PlayUpgradeEftFirst)
  150. {
  151. //TODO 要播放特效.
  152. ExitPowerUpPre(1);
  153. UpdateAttributeUI();
  154. }
  155. else if(resultType == HeroUpResultType.NeedOpenPreUI)
  156. {
  157. upPre = await UIManager.Instance.CreateGComponentForObject<HeroPowerUpPre>(objHeroPowerUpPre,
  158. delegate(HeroPowerUpPre pre)
  159. {
  160. EnterPowerUpPre(1);
  161. pre.OpenUpgradePre(heroInfo);
  162. }, root: rtBottom);
  163. }
  164. }
  165. private List<SimpleMove> simpleMoves = new List<SimpleMove>();
  166. private async void FlyInEft()
  167. {
  168. simpleMoves.Clear();
  169. upPre.Stars1Obj.SetActive(false);
  170. upPre.Stars2Obj.SetActive(false);
  171. await TimerComponent.Instance.WaitAsync(200);
  172. for (int i = 0; i < stars.Count; i++)
  173. {
  174. GameObject targetGo = upPre.Stars1[i] as GameObject;
  175. GameObject startGo = stars[i] as GameObject;
  176. RectTransform targetRT = targetGo.GetComponent<RectTransform>();
  177. RectTransform startRT = startGo.GetComponent<RectTransform>();
  178. SimpleMove sm = new SimpleMove(targetRT, startRT.position, targetRT.position);
  179. simpleMoves.Add(sm);
  180. }
  181. //把现在的星星隐藏了.
  182. StarsObj.SetActive(false);
  183. upPre.Stars1Obj.SetActive(true);
  184. int j = 0;
  185. float delayTime = 0;
  186. foreach (SimpleMove move in simpleMoves)
  187. {
  188. delayTime = (j++ * 0.05f);
  189. move.Start(delayTime);
  190. }
  191. await TimerComponent.Instance.WaitAsync(Mathf.RoundToInt((delayTime + 0.3f) * 1000));
  192. upPre.Stars2Obj.SetActive(true);
  193. }
  194. private async void FlyOutEft(List<object> startList)
  195. {
  196. int i = 0;
  197. // LayoutRebuilder.MarkLayoutForRebuild(StarsLayout.GetComponent<RectTransform>());
  198. // LayoutUtility.Layout(stars, LayoutType.Horizontal);
  199. simpleMoves.Clear();
  200. foreach (var star in stars)
  201. {
  202. GameObject targetGo = star as GameObject;
  203. GameObject startGo = startList[i++] as GameObject;
  204. //目标
  205. RectTransform targetRT = targetGo.GetComponent<RectTransform>();
  206. //起始
  207. RectTransform startRT = startGo.GetComponent<RectTransform>();
  208. SimpleMove sm = new SimpleMove(targetRT, startRT.position, targetRT.position);
  209. simpleMoves.Add(sm);
  210. }
  211. StarsObj.SetActive(true);
  212. int j = 0;
  213. float delayTime = 0f;
  214. foreach (SimpleMove move in simpleMoves)
  215. {
  216. delayTime = (j++ * 0.05f);
  217. move.Start(delayTime);
  218. }
  219. await TimerComponent.Instance.WaitAsync(Mathf.RoundToInt((delayTime + 0.3f) * 1000));
  220. // upPre.Stars2Layout.gameObject.SetActive(false);
  221. }
  222. /// <summary>
  223. /// 进入 升级/升星预览界面
  224. /// </summary>
  225. /// <param name="preTyp">1升级;2 升星</param>
  226. private void EnterPowerUpPre(byte preTyp)
  227. {
  228. isOpenPre = true;
  229. curPreTyp = preTyp;
  230. btns1.SetActive(false);
  231. if (preTyp == 1)
  232. {
  233. btnPromote.gameObject.SetActive(false);
  234. RectTransform rt = btnUpgrade.GetComponent<RectTransform>();
  235. rt.sizeDelta = new Vector2(510, rt.sizeDelta.y);
  236. rt.localPosition = new Vector3(47, rt.localPosition.y, rt.localPosition.z);
  237. }
  238. else
  239. {
  240. btnUpgrade.gameObject.SetActive(false);
  241. RectTransform rt = btnPromote.GetComponent<RectTransform>();
  242. rt.sizeDelta = new Vector2(510, rt.sizeDelta.y);
  243. rt.localPosition = new Vector3(47, rt.localPosition.y, rt.localPosition.z);
  244. FlyInEft();
  245. if (costHeroCount > curHeroCount)
  246. {
  247. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  248. }
  249. else
  250. {
  251. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Green";
  252. }
  253. }
  254. }
  255. /// <summary>
  256. /// 离开 升级/升星预览界面
  257. /// </summary>
  258. /// <param name="preTyp">1升级;2 升星</param>
  259. private void ExitPowerUpPre(byte preTyp, List<object> list = null)
  260. {
  261. isOpenPre = false;
  262. btns1.SetActive(true);
  263. // upPre.Stars1Layout.enabled = true;
  264. // upPre.Stars2Layout.enabled = true;
  265. if (preTyp == 1)
  266. {
  267. btnPromote.gameObject.SetActive(true);
  268. RectTransform rt = btnUpgrade.GetComponent<RectTransform>();
  269. rt.sizeDelta = new Vector2(400, rt.sizeDelta.y);
  270. rt.localPosition = new Vector3(163f, rt.localPosition.y, rt.localPosition.z);
  271. }
  272. else
  273. {
  274. FlyOutEft(list);
  275. btnUpgrade.gameObject.SetActive(true);
  276. RectTransform rt = btnPromote.GetComponent<RectTransform>();
  277. rt.sizeDelta = new Vector2(180, rt.sizeDelta.y);
  278. rt.localPosition = new Vector3(-135f, rt.localPosition.y, rt.localPosition.z);
  279. btnPromote.GetComponent<MyImage>().icon_name = "btn_l_Green";
  280. }
  281. objHeroPowerUpPre.SetActive(false);
  282. }
  283. private void OnClickClose()
  284. {
  285. CloseLogic();
  286. UIManager.Instance.HideUIUIPanel(this);
  287. }
  288. private void CloseLogic()
  289. {
  290. if (isOpenPre)
  291. {
  292. ExitPowerUpPre(curPreTyp, upPre.Stars1);
  293. }
  294. else
  295. {
  296. GObjectPool.Instance.Recycle(modelObj);
  297. }
  298. }
  299. public WidgetHero heroWidget;
  300. public UIPanelName sourcePanel;
  301. private GameObjectPool modelObj;
  302. HeroPowerUpPre upPre;
  303. public async void InitHeroDetailPanel(WidgetHero heroWidget, UIPanelName sourcePanel = UIPanelName.None)
  304. {
  305. this.heroInfo = heroWidget.heroInfo;
  306. this.heroWidget = heroWidget;
  307. this.sourcePanel = sourcePanel;
  308. skillUI.SetActive(false);
  309. btns1.SetActive(true);
  310. objHeroPowerUpPre.SetActive(false);
  311. //是否显示左右切换按钮
  312. btnNext.gameObject.SetActive(IsShowArrow(true));
  313. btnPrev.gameObject.SetActive(IsShowArrow(false));
  314. iconZhiYe.icon_name = heroInfo.GetZyIconName();
  315. heroName.text = LanguageManager.Instance.Text(heroInfo.modelConfig.name);
  316. // LayoutRebuilder.MarkLayoutForRebuild(StarsLayout.transform.GetComponent<RectTransform>());
  317. // StarsLayout.gameObject.SetActive(true);
  318. HeroUITools.SetStarShow(stars, heroInfo.star.Value);
  319. // StarsLayout.enabled = true;
  320. // StarsLayout.SetLayoutHorizontal();
  321. // await TimerComponent.Instance.WaitAsync(1);
  322. // StarsLayout.enabled = false;
  323. // await TimerComponent.Instance.WaitAsync(50);
  324. // StarsLayout.GetComponent<LayoutGroup>().s
  325. // StarsLayout.GetComponent<LayoutGroup>().SetDirty();
  326. // LayoutRebuilder.ForceRebuildLayoutImmediate(StarsLayout.GetComponent<RectTransform>());
  327. // GameObjectPool poolInterface =
  328. // await GObjectPool.Instance.FetchAsync<GameObjectPool>(heroInfo.modelConfig.model + ".prefab", null);
  329. modelObj = await GObjectPool.Instance.FetchAsync<GameObjectPool>(heroInfo.modelConfig.model + ".prefab",
  330. delegate(GameObjectPool pool)
  331. {
  332. pool.own.GetComponent<NavMeshAgent>().enabled = false;
  333. pool.own.transform.parent = ModelPos;
  334. pool.own.transform.localEulerAngles = new Vector3(0, 180, 0);
  335. pool.own.transform.localPosition = new Vector3(0, 0.2f, 0);
  336. pool.own.transform.localScale = Vector3.one;
  337. AnimancerComponent animancerComponent = pool.own.GetComponent<AnimancerComponent>();
  338. int max = animancerComponent.Transitions.Library.Count;
  339. for (int i = 0; i < max; i++)
  340. {
  341. if (animancerComponent.Transitions.Library.TryGetTransition(i,
  342. out TransitionModifierGroup transition))
  343. {
  344. TransitionAsset clipTransition2 = transition.Transition as TransitionAsset;
  345. if (clipTransition2 != null && clipTransition2.name == "idle")
  346. {
  347. animancerComponent.Play(clipTransition2);
  348. break;
  349. }
  350. }
  351. }
  352. HeroUITools.ChangeLayerRecursively(pool.own, LayerMask.NameToLayer("UI"));
  353. });
  354. switch (heroInfo.modelConfig.rarity)
  355. {
  356. case 1:
  357. heroRarity.text = LanguageManager.Instance.Text(32);
  358. break;
  359. case 2:
  360. heroRarity.text = LanguageManager.Instance.Text(31);
  361. break;
  362. case 3:
  363. heroRarity.text = LanguageManager.Instance.Text(30);
  364. break;
  365. default:
  366. LogTool.Error("找不到hero的稀有度:" + heroInfo.modelConfig.ID);
  367. break;
  368. }
  369. AnimateNumber animTxtHp = new AnimateNumber(targetTextPro:txtHP);
  370. AnimateNumber animTxtAtk = new AnimateNumber(targetTextPro:txtATK);
  371. AnimateNumber animTxtDef = new AnimateNumber(targetTextPro:txtDEF);
  372. AnimateNumber animTxtShanBi = new AnimateNumber(targetTextPro:txtSHANBI);
  373. animateNumberList = new List<AnimateNumber>();
  374. animateNumberList.Add(animTxtHp);
  375. animateNumberList.Add(animTxtAtk);
  376. animateNumberList.Add(animTxtDef);
  377. animateNumberList.Add(animTxtShanBi);
  378. UpdateAttributeUI(true);
  379. }
  380. private List<AnimateNumber> animateNumberList;
  381. private long curHeroCount;
  382. private long costHeroCount;
  383. public async void UpdateAttributeUI(bool isInit = false)
  384. {
  385. StarsObj.SetActive(true);
  386. PlayEft(isInit, txtHP, heroInfo.hp.Value.ToStringEx(), 0);
  387. // if (txtHP.text != heroInfo.hp.Value.ToStringEx())
  388. // {
  389. // long old = long.Parse(txtHP.text);
  390. // txtHP.text = heroInfo.hp.Value.ToStringEx();
  391. // if(!isInit)
  392. // await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  393. // {
  394. // heroUpTxtEft.txtEft.text = "+" + (heroInfo.hp.Value - old).ToStringEx();
  395. // },
  396. // poolName: "HeroUpTxtEft", root: eftNumPos[0] as RectTransform);
  397. // }
  398. PlayEft(isInit, txtATK, heroInfo.attack.Value.ToStringEx(), 1);
  399. // if (txtATK.text != heroInfo.attack.Value.ToStringEx())
  400. // {
  401. // long old = long.Parse(txtATK.text);
  402. // txtATK.text = heroInfo.attack.Value.ToStringEx();
  403. // if(!isInit)
  404. // await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  405. // {
  406. // heroUpTxtEft.txtEft.text = "+" + (heroInfo.attack.Value - old).ToStringEx();
  407. // },
  408. // poolName: "HeroUpTxtEft", root: eftNumPos[1] as RectTransform);
  409. // }
  410. PlayEft(isInit, txtDEF, heroInfo.defense.Value.ToStringEx(), 2);
  411. // if (txtDEF.text != heroInfo.defense.Value.ToStringEx())
  412. // {
  413. // long old = long.Parse(txtDEF.text);
  414. // txtDEF.text = heroInfo.defense.Value.ToStringEx();
  415. // if(!isInit)
  416. // await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(delegate(HeroUpTxtEft heroUpTxtEft)
  417. // {
  418. // heroUpTxtEft.txtEft.text = "+" + (heroInfo.defense.Value - old).ToStringEx();
  419. // },
  420. // poolName: "HeroUpTxtEft", root: eftNumPos[2] as RectTransform);
  421. // }
  422. PlayEft(isInit, txtSHANBI, heroInfo.shanbi.Value.ToStringEx(), 3);
  423. // if (txtSHANBI.text != heroInfo.shanbi.Value.ToStringEx())
  424. // {
  425. // txtSHANBI.text = heroInfo.shanbi.Value.ToStringEx();
  426. // if(!isInit)
  427. // await UIManager.Instance.CreateGComponent<HeroUpTxtEft>(null,
  428. // poolName: "HeroUpTxtEft", root: eftNumPos[3] as RectTransform);
  429. // }
  430. txtLv.text = heroInfo.level.Value.ToStringEx();
  431. txtExpGain.text = heroInfo.expGain.Value.ToStringEx();
  432. string redColorStar = "";
  433. string redColorEnd = "";
  434. long curExp = BagController.Instance.GetItemInfo(GlobalParam.Item_HeroExp_ID).count.Value;
  435. long costExp = heroInfo.powerUpConfig.levelUpExp;
  436. if (costExp > curExp)
  437. {
  438. redColorStar = "<color=#FF4C4C>";
  439. redColorEnd = "</color>";
  440. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  441. }
  442. else
  443. {
  444. redColorStar = "";
  445. redColorEnd = "";
  446. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Green";
  447. }
  448. txtUpgrade.text = redColorStar + curExp.ToStringEx() + redColorEnd + "/" + costExp.ToStringEx();
  449. curHeroCount = BagController.Instance.GetItemInfo(heroInfo.modelConfig.itemID).count.Value;
  450. costHeroCount = heroInfo.promoteConfig.costCount;
  451. if (costHeroCount > curHeroCount)
  452. {
  453. redColorStar = "<color=#FF4C4C>";
  454. redColorEnd = "</color>";
  455. }
  456. else
  457. {
  458. redColorStar = "";
  459. redColorEnd = "";
  460. }
  461. txtPromote.text = redColorStar + curHeroCount + redColorEnd + "/" + costHeroCount;
  462. // LogTool.Log(PlayerManager.Instance.heroController.CanUpgrade(heroInfo));
  463. // LogTool.Log(go1.activeSelf);
  464. if (PlayerManager.Instance.heroController.CanUpgrade(heroInfo) == HeroUpResultType.MainLevelNotEnough)
  465. {
  466. go1.SetActive(false);
  467. txtUpLimit.gameObject.SetActive(true);
  468. txtUpLimit.text = LanguageManager.Instance.Text(63);
  469. btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Gray";
  470. }
  471. else
  472. {
  473. go1.SetActive(true);
  474. txtUpLimit.gameObject.SetActive(false);
  475. // btnUpgrade.GetComponent<MyImage>().icon_name = "btn_l_Green";
  476. }
  477. }
  478. /// <summary>
  479. /// 当基础属性改变时,做一些表现
  480. /// </summary>
  481. /// <param name="isInit">是否为首次(初始), 首次不做动画处理</param>
  482. /// <param name="txtOld">当前(旧的)</param>
  483. /// <param name="txtNew"></param>
  484. /// <param name="eftRoot"></param>
  485. private async void PlayEft(bool isInit, TextMeshProUGUI txtOld, string txtNew, int idx)
  486. {
  487. if (txtOld.text != txtNew)
  488. {
  489. long old = long.Parse(txtOld.text);
  490. long newV = long.Parse(txtNew);
  491. txtOld.text = txtNew;
  492. if (!isInit)
  493. {
  494. animateNumberList[idx].Start(old, newV);
  495. await UIManager.Instance.CreateGComponent(delegate(HeroUpTxtEft heroUpTxtEft)
  496. {
  497. heroUpTxtEft.txtEft.text = "+" + (newV - old).ToStringEx();
  498. },
  499. poolName: "HeroUpTxtEft", root: eftNumPos[idx] as RectTransform);
  500. }
  501. }
  502. }
  503. }
  504. }