Unity3D-塔防遊戲專案主要原始碼(敵方炮車指令碼)
阿新 • • 發佈:2019-02-18
using UnityEngine;
using System.Collections;
namespace TowerDefenceTemplate
{
public class Enemy : MonoBehaviour
{
public enum EnemyType//敵方炮車型別
{
Jeep,
Tank,
Plane
};
public EnemyType enemyType;//例項化炮車型別
public EllipsoidParticleEmitter Explosion;//例項化粒子系統
public float
Health,//血量
Speed,//行進速度
current_health;//當前血量
public GameObject HealthBar;//血量條
private Transform CurrentWaypoint;//當前路點
private Transform[] Waypoints;//所有路點
private GameManager gameManager;//例項化遊戲管理器物件
private int
Award,//打死一個炮車獎勵的金幣
WaypointIndex;//路點的索引
private bool Dead;//判定炮車是否死亡
void Start()
{
gameManager = FindObjectOfType<GameManager>();//找到GameManager指令碼
if (gameManager == null)//異常處理
{
Debug.LogError("GameManager not found!" );
enabled = false;
return;
}
Speed = gameManager.Waves[gameManager.CurrentWaveIndex].Speed;//獲取控制器中控制炮車行進速度
Health = gameManager.Waves[gameManager.CurrentWaveIndex].Health;//。。。血量
Award = gameManager.Waves[gameManager.CurrentWaveIndex].Award;//。。。獎勵
Waypoints = gameManager.Waves[gameManager.CurrentWaveIndex].Waypoints;//。。。路點
current_health = Health;//賦值給當前血量
HealthBar.transform.localScale = Vector3.one;//血條不進行縮放
CurrentWaypoint = Waypoints[WaypointIndex];//給當前路點賦值
if (enemyType == EnemyType.Jeep)//如果炮車的型別是吉普
{
gameManager.JeepSound.Play();//開啟吉普車行進的音效
}
if (enemyType == EnemyType.Tank)
{
gameManager.TankSound.Play();
}
if (enemyType == EnemyType.Plane)
{
gameManager.PlaneSound.Play();
}
}
void GetDamage(float damage)//得到的傷害
{
if (Dead)//如果沒血了
{
return;//結束當前方法
}
current_health -= damage;//減血
HealthBar.transform.localScale = new Vector3(current_health / Health, 1, 1);//血條縮短
if (current_health <= 0 && !Dead)//如果血量非正並且沒死
{
Die();//讓它死
}
}
void Moving()//移動
{
if (!Dead)//如果沒有死
{
Quaternion TargetRotation = Quaternion.LookRotation(CurrentWaypoint.position - transform.position, transform.up);//定義旋轉度
transform.rotation = Quaternion.RotateTowards(transform.rotation, TargetRotation, Time.deltaTime * 100);//讓炮車做旋轉
}
transform.Translate(transform.forward * Time.deltaTime * Speed, Space.World);//讓炮車向正前方向移動
if (Vector3.Distance(transform.position, CurrentWaypoint.position) < 2f)//當炮車的位置和當前路點的距離小於2時
{
if ((Waypoints.Length - 1) > WaypointIndex)//當前路點索引不是最後一個索引
{
NextWaypoint();//當前路點+1
}
else
{
gameManager.DamageBase();//玩家血量減少
Deactivating();//消滅本波次的敵人
}
}
}
IEnumerator SinkInGround()//協同列舉器
{
for (float f = 0; f < 2; f += Time.deltaTime)
{
transform.position += new Vector3(0, -f / 5, 0);
Speed *= (1 - f / 2);
yield return null;
}
}
IEnumerator FallDown()//協同墜落列舉器
{
for (float f = 0; f < 2; f += Time.deltaTime)
{
transform.position += new Vector3(0, -f / 5, 0);
Speed += f / 2;
yield return null;
}
}
void NextWaypoint()//下一路點設定為當前路點
{
WaypointIndex += 1;
CurrentWaypoint = Waypoints[WaypointIndex];
}
void Update()
{
Moving();//敵方炮車移動
HealthBar.transform.position = Camera.main.WorldToScreenPoint(transform.position) + new Vector3(-30, -20, 0);//血條跟隨炮車移動
}
void Deactivating()
{
Destroy(gameObject);//消滅炮車
Destroy(HealthBar);//銷燬血條
for (int i = 0; i < gameManager.SpawnedEnemies.Count; i++)//遍歷本波次所有的炮車
{
if (gameManager.SpawnedEnemies[i].Equals(gameObject))//如果當前的炮車和空物體相等
{
gameManager.SpawnedEnemies.RemoveAt(i);//炮車集合裡移除這個炮車
}
}
}
void Die()//死亡
{
Explosion.Emit();//粒子系統呼叫
if (enemyType != EnemyType.Plane)//如果敵機的型別不是飛機
{
StartCoroutine(SinkInGround());//開始協同程式
}
else
{
StartCoroutine(FallDown());//開始協同程式,墜機
}
HealthBar.transform.localScale = Vector3.zero;//血條縮為0
tag = "Dead";//標籤設定為Dead
Dead = true;//狀態改為Dead
gameManager.ExplosionSound.Play();//爆炸聲效
gameManager.AddMoney(Award);//玩家的金幣增加
Invoke("Deactivating", 2);//兩秒後執行Deactivating方法
}
}
}