/* =============================
* 作者:Snowe (斯诺)
* QQ:275273997
* Email:snowe0517@gmail.com ,snowe@isnowe.com
*==============================*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tower : MonoBehaviour {
//タワーname
public string Name;
//攻撃距離
public float range = 20;
//最大距離
public float maxRange = 30;
//リロード時間
public float reloadRate = 1;
//最もリロード時間
public float finalReloadRate = 1;
//最大パワーの倍数
public float finalPowerMultiplier = 1f;
//弾のプロジェクト
public Projectile projectilePrefab;
//弾を発射するときの位置
public Transform projectileSpawnPoint;
//後何秒発射のTime
float currentReloadTime = 0;
//今のlevel
public int level = 0;
//タワーScale用変数
//塔大小基础值
public float scaleMultiplier = 0.0005f;
//タワー最大Level
//塔最大等级
const int maxLevel = 4;
//タワーID、今どんなタワー選択したか
//防御塔ID
public int Tower_ID;
//タワーの値段Levelup値段
//塔的价格列表
public int[] upgradeCosts = { 100, 150, 250, 320, 500 };
//敵のScript
//敌人的脚本
public EnemyMovement finalTarget { get; set; }
//音が保存している配列
//音效列表
public AudioClip[] audioClip;
///
/// Levelを取得と設定
/// Levelを設定すると、タワーのサイズも増えてることになる
/// 获取塔的等级,和根据塔的等级改变大小
///
public int Level
{
get { return level; }
set
{
level = value;
//限制塔的最大等级
if (level > maxLevel) level = maxLevel;
//计算塔的大小
float towerSize = scaleMultiplier * (level + 12f);
//设定塔对象的大小
transform.localScale = new Vector3(towerSize, towerSize, towerSize);
}
}
//攻撃範囲を取得
//攻击范围
public float Range
{
//レベルによって変化する
//根据等级获取攻击范围
get { return Mathf.Lerp(range,maxRange , (float)level/maxLevel); }
}
//発射リロード時間を取得
//攻击间隔
public float ReloadRate
{
//レベルによって変化する
//根据等级获取攻击间隔
get { return Mathf.Lerp(reloadRate,finalReloadRate , (float)level/maxLevel); }
}
//パワーの倍数を取得
//塔的攻击倍数
public float PowerMultiplier
{
//レベルによって変化する
//根据等级计算攻击力倍数
get { return Mathf.Lerp(1,finalPowerMultiplier, (float)level/(float)maxLevel); }
}
//表示用パワー変数
//显示用攻击力变量
public float powerdisplay;
void Start()
{
//表示用パワー変数初期化
//初始化攻击力显示数值
powerdisplay = projectilePrefab.power;
}
// Update is called once per frame
void Update()
{
//今のリロード時間0より大きいなら
//判断攻击时间
if (currentReloadTime > 0)
{
//減ること
//倒计时
currentReloadTime -= Time.deltaTime;
}
else
{
//当たり範囲の配列
//寻找攻击范围内的敌人
Collider[] colList = Physics.OverlapSphere(transform.position, range);
//敌人对象初始值
finalTarget = null;//敵変数空にする
//计算距离用变量
float minimumDistance = 0;//距離計算用変数
//遍历查找到的对象
foreach (var col in colList)
{
//敵のScriptを持っているProjectは新しい敵scriptに代入
//获取到敌人的脚本
EnemyMovement target = col.GetComponent();
if (target != null)
{
//もし目標敵が空なら上げる
//如果目标为空就重新赋值
if (finalTarget == null)
{
finalTarget = target;
minimumDistance = target.RemainingDistance;
}
//敵の距離小より前の距離なら
//查找到的目标对象距离小于之前的距离时重新赋值目标对象
if (target.RemainingDistance < minimumDistance)
{
finalTarget = target;
minimumDistance = target.RemainingDistance;
}
}
}
//目标不为空时进行攻击
if (finalTarget != null) Attack(finalTarget);
}
}
///
/// 発射
/// 塔的攻击处理
///
/// 敵
void Attack(EnemyMovement target)
{
//生成子弹
Projectile instance = Instantiate(projectilePrefab, projectileSpawnPoint.transform.position, Quaternion.identity);
instance.target = target;//定义目标
instance.range = Range;//攻击范围
instance.power = (int)(instance.power * PowerMultiplier);//子弹威力
currentReloadTime = ReloadRate;//重置攻击时间
Destroy(instance.gameObject, 5);//5秒删除对象
//Debug.Log("Reload Time: " + reloadTime);
}
///
/// タワーのレベルアップ
/// 塔升级
///
/// 成功するかどうか
public bool Upgrade()
{
int startingLevel = Level;
//判断是否到最高等级
if (startingLevel + 1 > maxLevel)
{
Debug.Log("已经到了最大等级.");
return false;
}
//判断有没有钱
if (!Nexus.CurrentInstance.UseMana(upgradeCosts[startingLevel + 1])) return false;
Level++;
//威力提升计算
powerdisplay = projectilePrefab.power;
powerdisplay = (int)(powerdisplay * PowerMultiplier);
NewAudio(audioClip[0]);//创建塔升级音乐
return true;
}
///
/// タワーを売る
/// 卖掉塔
///
public void Sell()
{
int money = 0;
for (int i = 0; i <= level; i++)
{
//计算此塔的总消费
money += upgradeCosts[i];
}
//计算卖出后得价格
money = (int)(money * 0.7f);
//增加能源
Nexus.CurrentInstance.GainMana(money);
NewAudio(audioClip[1]);//创建卖掉塔的音乐
Destroy(this.gameObject);
}
///
/// Soundを生成してプレイしてから削除
/// 生成音效,播放后自动删除
///
/// 音效
void NewAudio(AudioClip clip)
{
//新しいProjectを生成
GameObject newaudio = new GameObject();
//soundを設定
newaudio.AddComponent().clip = clip;
//soundの音量を設定
newaudio.GetComponent().volume = 0.2f;
//soundをプレイ
newaudio.GetComponent().Play();
//2秒後削除
Destroy(newaudio, 2);
}
}