UpgradeUI.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. using System;
  2. using Player.Wallet;
  3. using TMPro;
  4. using UnityEngine;
  5. public class UpgradeUI : MonoBehaviour
  6. {
  7. // 升级价格显示文本数组
  8. [SerializeField] private TextMeshProUGUI[] upgradePriceDisplayText;
  9. // 升级等级显示文本数组
  10. [SerializeField] private TextMeshProUGUI[] levelDisplayText;
  11. // 升级音效
  12. [SerializeField] private AudioSource upgradeAudioSource;
  13. // 玩家升级数据(0:战士数量 1:弓箭手数量 2:战士等级 3:弓箭手等级)
  14. private int[] _playerUpgradesLevel = new int[4];
  15. // 钱包引用
  16. private Wallet _wallet;
  17. /// <summary>
  18. /// 初始化升级数据和UI,首次启动时设置默认值
  19. /// </summary>
  20. private void Awake()
  21. {
  22. if (PlayerPrefs.GetInt("_playerWarriorLevel") == 0)
  23. {
  24. // 如果是新游戏,设置初始值
  25. PlayerPrefs.SetInt("_playerWarriorLevel", 3); // 增加初始战士数量
  26. PlayerPrefs.SetInt("_playerArcherLevel", 2); // 增加初始弓箭手数量
  27. PlayerPrefs.SetInt("_playerUpgradeWarriorLevel", 2); // 增加初始战士等级
  28. PlayerPrefs.SetInt("_playerUpgradeArcherLevel", 2); // 增加初始弓箭手等级
  29. }
  30. _playerUpgradesLevel[0] = PlayerPrefs.GetInt("_playerWarriorLevel");
  31. _playerUpgradesLevel[1] = PlayerPrefs.GetInt("_playerArcherLevel");
  32. _playerUpgradesLevel[2] = PlayerPrefs.GetInt("_playerUpgradeWarriorLevel");
  33. _playerUpgradesLevel[3] = PlayerPrefs.GetInt("_playerUpgradeArcherLevel");
  34. _wallet = FindObjectOfType<Wallet>();
  35. UpdateText();
  36. }
  37. /// <summary>
  38. /// 购买新战士,消耗金币并增加数量
  39. /// </summary>
  40. public void BuyWarrior()
  41. {
  42. if (_wallet.GetMoney >= GetPrice(0))
  43. {
  44. _wallet.UseMoney(GetPrice(0));
  45. _playerUpgradesLevel[0]++;
  46. ComponentsManager.PlayerArmyManager.AddNewWarrior();
  47. SaveDatas();
  48. UpdateText();
  49. }
  50. }
  51. /// <summary>
  52. /// 购买新弓箭手,消耗金币并增加数量
  53. /// </summary>
  54. public void BuyArcher()
  55. {
  56. if (_wallet.GetMoney >= GetPrice(1))
  57. {
  58. _wallet.UseMoney(GetPrice(1));
  59. _playerUpgradesLevel[1]++;
  60. ComponentsManager.PlayerArmyManager.AddNewArcher();
  61. SaveDatas();
  62. UpdateText();
  63. if (ComponentsManager.Tutorial)
  64. {
  65. if (ComponentsManager.Tutorial.GetStep == 1)
  66. ComponentsManager.Tutorial.NextStep(2, true);
  67. }
  68. }
  69. else
  70. {
  71. // 金币不足时,直接关闭引导动画
  72. if (ComponentsManager.Tutorial)
  73. {
  74. ComponentsManager.Tutorial.ForceHidePointerAndUnlock();
  75. }
  76. }
  77. }
  78. /// <summary>
  79. /// 升级所有战士等级,消耗金币并重置玩家单位
  80. /// </summary>
  81. public void UpgradeWarriors()
  82. {
  83. if (_wallet.GetMoney >= GetPrice(2))
  84. {
  85. _wallet.UseMoney(GetPrice(2));
  86. _playerUpgradesLevel[2]++;
  87. ComponentsManager.PlayerArmyManager.ResetPlayerWarriors();
  88. SaveDatas();
  89. UpdateText();
  90. }
  91. }
  92. /// <summary>
  93. /// 升级所有弓箭手等级,消耗金币并重置玩家单位
  94. /// </summary>
  95. public void UpgradeArchers()
  96. {
  97. if (_wallet.GetMoney >= GetPrice(3))
  98. {
  99. _wallet.UseMoney(GetPrice(3));
  100. _playerUpgradesLevel[3]++;
  101. ComponentsManager.PlayerArmyManager.ResetPlayerWarriors();
  102. SaveDatas();
  103. UpdateText();
  104. if (ComponentsManager.Tutorial)
  105. {
  106. if (ComponentsManager.Tutorial.GetStep == 3)
  107. ComponentsManager.Tutorial.NextStep(4, true);
  108. }
  109. }
  110. }
  111. /// <summary>
  112. /// 获取当前战士升级等级
  113. /// </summary>
  114. public int GetWarriorLevelUpgrade()
  115. {
  116. return _playerUpgradesLevel[2];
  117. }
  118. /// <summary>
  119. /// 获取当前弓箭手升级等级
  120. /// </summary>
  121. public int GetArcherLevelUpgrade()
  122. {
  123. return _playerUpgradesLevel[3];
  124. }
  125. /// <summary>
  126. /// 计算升级价格
  127. /// </summary>
  128. /// <param name="id">升级类型索引</param>
  129. /// <returns>升级所需金币</returns>
  130. private int GetPrice(int id)
  131. {
  132. return (int) (GameBalance.UpgradeBase[id].BasePrice *
  133. Math.Pow(GameBalance.UpgradeBase[id].BasePriceCoefficient, _playerUpgradesLevel[id]));
  134. }
  135. /// <summary>
  136. /// 刷新升级价格和等级文本
  137. /// </summary>
  138. private void UpdateText()
  139. {
  140. for (int i = 0; i < upgradePriceDisplayText.Length; i++)
  141. {
  142. upgradePriceDisplayText[i].SetText(GetPrice(i).ToString());
  143. levelDisplayText[i].SetText((_playerUpgradesLevel[i] + 1).ToString());
  144. }
  145. levelDisplayText[0].SetText((_playerUpgradesLevel[0] + 2).ToString());
  146. levelDisplayText[1].SetText((_playerUpgradesLevel[1]).ToString());
  147. }
  148. /// <summary>
  149. /// 保存升级数据到本地存档,并播放音效
  150. /// </summary>
  151. private void SaveDatas()
  152. {
  153. PlayerPrefs.SetInt("_playerWarriorLevel", _playerUpgradesLevel[0]);
  154. PlayerPrefs.SetInt("_playerArcherLevel", _playerUpgradesLevel[1]);
  155. PlayerPrefs.SetInt("_playerUpgradeWarriorLevel", _playerUpgradesLevel[2]);
  156. PlayerPrefs.SetInt("_playerUpgradeArcherLevel", _playerUpgradesLevel[3]);
  157. upgradeAudioSource.Play();
  158. }
  159. }