HeroDetailPanel.cs 18 KB

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