1. 程式人生 > >Unity3D-塔防遊戲專案主要原始碼(敵方炮車指令碼)

Unity3D-塔防遊戲專案主要原始碼(敵方炮車指令碼)

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方法 } } }