Tower.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /* =============================
  2. * 作者:Snowe (斯诺)
  3. * QQ:275273997
  4. * Email:snowe0517@gmail.com ,snowe@isnowe.com
  5. *==============================*/
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using UnityEngine;
  9. public class Tower : MonoBehaviour {
  10. //タワーname
  11. public string Name;
  12. //攻撃距離
  13. public float range = 20;
  14. //最大距離
  15. public float maxRange = 30;
  16. //リロード時間
  17. public float reloadRate = 1;
  18. //最もリロード時間
  19. public float finalReloadRate = 1;
  20. //最大パワーの倍数
  21. public float finalPowerMultiplier = 1f;
  22. //弾のプロジェクト
  23. public Projectile projectilePrefab;
  24. //弾を発射するときの位置
  25. public Transform projectileSpawnPoint;
  26. //後何秒発射のTime
  27. float currentReloadTime = 0;
  28. //今のlevel
  29. public int level = 0;
  30. //タワーScale用変数
  31. //塔大小基础值
  32. public float scaleMultiplier = 0.0005f;
  33. //タワー最大Level
  34. //塔最大等级
  35. const int maxLevel = 4;
  36. //タワーID、今どんなタワー選択したか
  37. //防御塔ID
  38. public int Tower_ID;
  39. //タワーの値段Levelup値段
  40. //塔的价格列表
  41. public int[] upgradeCosts = { 100, 150, 250, 320, 500 };
  42. //敵のScript
  43. //敌人的脚本
  44. public EnemyMovement finalTarget { get; set; }
  45. //音が保存している配列
  46. //音效列表
  47. public AudioClip[] audioClip;
  48. /// <summary>
  49. /// Levelを取得と設定
  50. /// Levelを設定すると、タワーのサイズも増えてることになる
  51. /// 获取塔的等级,和根据塔的等级改变大小
  52. /// </summary>
  53. public int Level
  54. {
  55. get { return level; }
  56. set
  57. {
  58. level = value;
  59. //限制塔的最大等级
  60. if (level > maxLevel) level = maxLevel;
  61. //计算塔的大小
  62. float towerSize = scaleMultiplier * (level + 12f);
  63. //设定塔对象的大小
  64. transform.localScale = new Vector3(towerSize, towerSize, towerSize);
  65. }
  66. }
  67. //攻撃範囲を取得
  68. //攻击范围
  69. public float Range
  70. {
  71. //レベルによって変化する
  72. //根据等级获取攻击范围
  73. get { return Mathf.Lerp(range,maxRange , (float)level/maxLevel); }
  74. }
  75. //発射リロード時間を取得
  76. //攻击间隔
  77. public float ReloadRate
  78. {
  79. //レベルによって変化する
  80. //根据等级获取攻击间隔
  81. get { return Mathf.Lerp(reloadRate,finalReloadRate , (float)level/maxLevel); }
  82. }
  83. //パワーの倍数を取得
  84. //塔的攻击倍数
  85. public float PowerMultiplier
  86. {
  87. //レベルによって変化する
  88. //根据等级计算攻击力倍数
  89. get { return Mathf.Lerp(1,finalPowerMultiplier, (float)level/(float)maxLevel); }
  90. }
  91. //表示用パワー変数
  92. //显示用攻击力变量
  93. public float powerdisplay;
  94. void Start()
  95. {
  96. //表示用パワー変数初期化
  97. //初始化攻击力显示数值
  98. powerdisplay = projectilePrefab.power;
  99. }
  100. // Update is called once per frame
  101. void Update()
  102. {
  103. //今のリロード時間0より大きいなら
  104. //判断攻击时间
  105. if (currentReloadTime > 0)
  106. {
  107. //減ること
  108. //倒计时
  109. currentReloadTime -= Time.deltaTime;
  110. }
  111. else
  112. {
  113. //当たり範囲の配列
  114. //寻找攻击范围内的敌人
  115. Collider[] colList = Physics.OverlapSphere(transform.position, range);
  116. //敌人对象初始值
  117. finalTarget = null;//敵変数空にする
  118. //计算距离用变量
  119. float minimumDistance = 0;//距離計算用変数
  120. //遍历查找到的对象
  121. foreach (var col in colList)
  122. {
  123. //敵のScriptを持っているProjectは新しい敵scriptに代入
  124. //获取到敌人的脚本
  125. EnemyMovement target = col.GetComponent<EnemyMovement>();
  126. if (target != null)
  127. {
  128. //もし目標敵が空なら上げる 
  129. //如果目标为空就重新赋值
  130. if (finalTarget == null)
  131. {
  132. finalTarget = target;
  133. minimumDistance = target.RemainingDistance;
  134. }
  135. //敵の距離小より前の距離なら
  136. //查找到的目标对象距离小于之前的距离时重新赋值目标对象
  137. if (target.RemainingDistance < minimumDistance)
  138. {
  139. finalTarget = target;
  140. minimumDistance = target.RemainingDistance;
  141. }
  142. }
  143. }
  144. //目标不为空时进行攻击
  145. if (finalTarget != null) Attack(finalTarget);
  146. }
  147. }
  148. /// <summary>
  149. /// 発射
  150. /// 塔的攻击处理
  151. /// </summary>
  152. /// <param name="target">敵</param>
  153. void Attack(EnemyMovement target)
  154. {
  155. //生成子弹
  156. Projectile instance = Instantiate(projectilePrefab, projectileSpawnPoint.transform.position, Quaternion.identity);
  157. instance.target = target;//定义目标
  158. instance.range = Range;//攻击范围
  159. instance.power = (int)(instance.power * PowerMultiplier);//子弹威力
  160. currentReloadTime = ReloadRate;//重置攻击时间
  161. Destroy(instance.gameObject, 5);//5秒删除对象
  162. //Debug.Log("Reload Time: " + reloadTime);
  163. }
  164. /// <summary>
  165. /// タワーのレベルアップ
  166. /// 塔升级
  167. /// </summary>
  168. /// <returns>成功するかどうか</returns>
  169. public bool Upgrade()
  170. {
  171. int startingLevel = Level;
  172. //判断是否到最高等级
  173. if (startingLevel + 1 > maxLevel)
  174. {
  175. Debug.Log("已经到了最大等级.");
  176. return false;
  177. }
  178. //判断有没有钱
  179. if (!Nexus.CurrentInstance.UseMana(upgradeCosts[startingLevel + 1])) return false;
  180. Level++;
  181. //威力提升计算
  182. powerdisplay = projectilePrefab.power;
  183. powerdisplay = (int)(powerdisplay * PowerMultiplier);
  184. NewAudio(audioClip[0]);//创建塔升级音乐
  185. return true;
  186. }
  187. /// <summary>
  188. /// タワーを売る
  189. /// 卖掉塔
  190. /// </summary>
  191. public void Sell()
  192. {
  193. int money = 0;
  194. for (int i = 0; i <= level; i++)
  195. {
  196. //计算此塔的总消费
  197. money += upgradeCosts[i];
  198. }
  199. //计算卖出后得价格
  200. money = (int)(money * 0.7f);
  201. //增加能源
  202. Nexus.CurrentInstance.GainMana(money);
  203. NewAudio(audioClip[1]);//创建卖掉塔的音乐
  204. Destroy(this.gameObject);
  205. }
  206. /// <summary>
  207. /// Soundを生成してプレイしてから削除
  208. /// 生成音效,播放后自动删除
  209. /// </summary>
  210. /// <param name="clip">音效</param>
  211. void NewAudio(AudioClip clip)
  212. {
  213. //新しいProjectを生成
  214. GameObject newaudio = new GameObject();
  215. //soundを設定
  216. newaudio.AddComponent<AudioSource>().clip = clip;
  217. //soundの音量を設定
  218. newaudio.GetComponent<AudioSource>().volume = 0.2f;
  219. //soundをプレイ
  220. newaudio.GetComponent<AudioSource>().Play();
  221. //2秒後削除
  222. Destroy(newaudio, 2);
  223. }
  224. }