HeroDetailPanel.cs 21 KB

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