HeroDetailPanel.cs 23 KB

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