HeroDetailPanel.cs 19 KB

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