小白貪狼做塔防(4)

現(xiàn)在呢我們來搞一下防御塔對(duì)怪物的檢測邏輯。
首先呢胀茵,我想到了觸發(fā)器檢測琼娘,并配以一條列表儲(chǔ)存在該防御塔射程內(nèi)的所有敵人附鸽。
那么我們來建一個(gè)CheckEnemy腳本,用來監(jiān)測敵人熄浓,跟隨注視并攻擊省撑。

組件及腳本設(shè)置

話不多說竟秫,貼上代碼先:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckEnemy : MonoBehaviour {
    /// <summary>
    /// 炮塔價(jià)格
    /// </summary>
    public float value = 100;
    /// <summary>
    /// 開火頻率
    /// </summary>
    public int firewaittime = 2;
    /// <summary>
    /// 臨時(shí)ID肥败,測試
    /// </summary>
    public int idi = 0;
    /// <summary>
    /// 炮塔轉(zhuǎn)動(dòng)速度
    /// </summary>
    public float turnSpeed = 2;
    /// <summary>
    /// 最遠(yuǎn)攻擊距離
    /// </summary>
    public float disFire = 12;
    /// <summary>
    /// 是否有正在攻擊的目標(biāo)
    /// </summary>  
    private bool isAlarm;
    /// <summary>
    /// 子彈
    /// </summary>
    public GameObject ziDan;
    /// <summary>
    /// 子彈生成位置
    /// </summary>
    public Transform firePos;
    /// <summary>
    /// 攻擊目標(biāo)
    /// </summary>
    private Transform targetEnemy;
    /// <summary>
    /// 存儲(chǔ)所有檢測到的敵人
    /// </summary>
    private List<Transform> enemyList;
    /// <summary>
    /// 開火的協(xié)程是否開啟
    /// </summary>
    private bool isFire = false;

    private Input_Key ik;
    void Start () 
        {
        enemyList = new List<Transform>();
    }
    
    void Update () {
        //攻擊隊(duì)列里有敵人
        if (enemyList.Count != 0)
        {
            if (enemyList[0] == null)
            {
                enemyList[0] = enemyList[1];
                enemyList.Remove(enemyList[1]);
            }
            else
            {
                if (!isFire)
                {
                    isFire = true;
                    StartCoroutine("Fire");
                }
                //瞄準(zhǔn)敵人
                //transform.LookAt(enemyList[0]);
                Vector3 direction = enemyList[0].position - transform.position;
                Quaternion qua = Quaternion.LookRotation(direction);
                transform.rotation = Quaternion.Lerp(transform.rotation, qua, Time.deltaTime * turnSpeed);
                ////如果敵人脫離攻擊范圍,或者死亡                   
                if (Vector3.Distance(transform.position, enemyList[0].position) > disFire || enemyList[0].GetComponent<EnemyContrl>().Blood <= 0)
                {
                    enemyList.Remove(enemyList[0]);
                }
            }
        }
        else
        {
            if (isFire)
            {
                StopCoroutine("Fire");
                isFire = false;
            }
        }
    }
    /// <summary>
    /// 檢測觸發(fā)物是否為敵人,是的話放入攻擊列表
    /// </summary>
    void OnTriggerEnter(Collider other) 
    {
        //可以改成檢測空中和地上
        if (other.transform.tag == "Enemy"||other.transform.tag == "FlyEnemy")
        {
            if (!enemyList.Contains(other.transform)) {
                enemyList.Add(other.transform);
            }        
        }
    }
    /// <summary>
    /// 炮塔射擊敵人
    /// </summary>
    IEnumerator Fire() {       
        while (true) {
            if (enemyList.Count != 0 && enemyList[0] != null)
            {
                //生成子彈并指定發(fā)射的目標(biāo)
                GameObject go = Instantiate<GameObject>(ziDan, firePos.transform.position, firePos.transform.rotation);
                go.GetComponent<ZhaDan>().target = enemyList[0];
            }
            else if (enemyList[0] == null) {
                enemyList.Remove(enemyList[0]);
            }
            yield return new WaitForSeconds(firewaittime);        
        }      
    }
}

這里有一小點(diǎn):如果不寫下面的這個(gè)就會(huì)出現(xiàn)n座塔同時(shí)攻擊有一個(gè)目標(biāo),怪物被其中一座塔收走人頭往史,其他以該怪物為目標(biāo)的塔就會(huì)丟失目標(biāo)而啞火。

if (enemyList[0] == null)
            {
                enemyList[0] = enemyList[1];
                enemyList.Remove(enemyList[1]);
            }

為了改正這個(gè)bug挨决,我一開始是想直接在enemyList[0] = null時(shí)enemyList.Remove(enemyList[0])脖祈,但是不知道為什么還是會(huì)出錯(cuò)刷晋,所以我就改成把enemyList[1]提前一個(gè)單位,并enemyList.Remove(enemyList[1])喻奥,這樣就好使了捏悬,坑爹啊,各位大神如果知道原因請(qǐng)?jiān)谠u(píng)論區(qū)賜教貪狼感激不盡甥厦。

然后我們迎來了本游戲的重頭戲“防御塔”攻擊方式——彈藥寇钉。我分成了三大類:1.單體攻擊類,2.范圍攻擊類。而這兩類又可以分別派生出對(duì)地類谦秧,對(duì)空類甚至減速buff這種buff類
首先油够,我們來看看單體攻擊類:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour {

    public float damageValue = 25f;
    /// <summary>
    /// 攻擊目標(biāo)
    /// </summary>
    public Transform target;
    /// <summary>
    /// 子彈發(fā)射速度
    /// </summary>
    public float speed = 10f;
    void Update () 
        {
        if (target&&target!=null)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.transform.position+new Vector3(0,1.5f,0), speed * Time.deltaTime);
        }
//丟失目標(biāo)
        else {
            Destroy(transform.gameObject);
        }
    }
//此處為對(duì)地對(duì)空雙功能征懈,你可以改成單一功能
    void OnTriggerEnter(Collider other) {
        if (other.transform.tag == "Enemy"|| other.transform.tag == "FlyEnemy") {
            other.GetComponent<EnemyContrl>().EnemyHurt(damageValue);
            Destroy(this.gameObject);
        }
    }
}

然后是范圍傷害類:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ZhaDan : MonoBehaviour {

    public float DamageOffeset;
    public float damageValue;
    /// <summary>
    /// 攻擊目標(biāo)
    /// </summary>
    public Transform target;
    /// <summary>
    /// 子彈發(fā)射速度
    /// </summary>
    public float speed = 10f;
    // Use this for initialization
    /// <summary>
    /// AOE半徑
    /// </summary>
    public float r = 1f;
    void Start()
    {

    }

    void Update()
    {
        if (target.GetComponent<CapsuleCollider>() !=null)
        {
            if (transform.tag != "Ice")
            {
                transform.position = Vector3.MoveTowards(transform.position, target.transform.position + new Vector3(0, 2.5f, 0), speed * Time.deltaTime);
            }
            else {
                transform.position = Vector3.MoveTowards(transform.position, target.transform.position + new Vector3(0, 0.1f, 0), speed * Time.deltaTime);
            }        
        }
        else
        {
            Destroy(transform.gameObject);
        }
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.transform.tag == "Enemy")
        {
            Grenade_AOE_Damage(transform, r, damageValue);
              
        }
    }
    void Grenade_AOE_Damage(Transform _grenade, float _AOE_radius, float _damage)
    {
            //獲取手雷_AOE_radius范圍內(nèi)所有的碰撞體(敵人)
            Collider[] colliders = Physics.OverlapSphere(_grenade.position, _AOE_radius);
         
            //遍歷范圍內(nèi)所有敵人并給予傷害
            for (int i = 0; i < colliders.Length; i++)
            {
            
            bool isCap = colliders[i].GetType() == (typeof(CapsuleCollider));
         
            if (isCap && (colliders[i].gameObject.tag=="Enemy"))
            {
              
                //判斷距離中心爆炸點(diǎn)距離鬼悠,并實(shí)現(xiàn)傷害衰減
                float dis = Vector3.Distance(colliders[i].transform.position, _grenade.position);
                float dam = _damage - dis * DamageOffeset;
                //加上特效

                //獲取生命腳本組件,調(diào)用傷害函數(shù)
                colliders[i].gameObject.GetComponent<EnemyContrl>().EnemyHurt(dam);
            }
             
            }
        StartCoroutine(Boom());
    }

    IEnumerator Boom() {
        transform.GetComponent<MeshRenderer>().enabled = false;
        GameObject go;
        if (transform.tag == "Bomb")
        {
            go = Instantiate<GameObject>((GameObject)Resources.Load("fireball/Boom/Prefabs/Bomb"), transform.position, transform.rotation);
        } else if (transform.tag == "Ice") {
            go = Instantiate<GameObject>((GameObject)Resources.Load("fireball/IceEffect/Prefabs/Fx/IceGo"), transform.position, transform.rotation);
        }
        else {
            go = null;
        }
        yield return new WaitForSeconds(0.8f);
        Destroy(this.gameObject);
        if (go != null) {
            Destroy(go);
        }      
    }
}

然后我們上網(wǎng)下載一個(gè)冰霜特效和爆炸特效蹬挺,可以增加真實(shí)感它掂,并在冰霜特效上掛載腳本控制減速協(xié)程:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class IceBullet : MonoBehaviour {
    void Start () {
    }
    
    // Update is called once per frame
    void Update () {
        
    }

    void OnTriggerEnter(Collider other) { 
         if (other.transform.tag == "Enemy" && other.transform.GetComponent<NavMeshAgent>())
         {
            other.transform.GetComponent<EnemyContrl>().DealSpeed();
         }       
    }
}

這時(shí)虐秋,我們需要在EnemyContrl腳本及加些“零件”:

private bool isLowSpeed = false;
public void DealSpeed() {
        if (isLowSpeed)
        {
            return;
        }
        else {
            isLowSpeed = true;
            StartCoroutine(LowSpeed());          
        }
    }

    IEnumerator LowSpeed() {
        transform.GetComponent<NavMeshAgent>().speed /= 2;
        yield return new WaitForSeconds(2.5f);
        if(transform.GetComponent<NavMeshAgent>())
            transform.GetComponent<NavMeshAgent>().speed *= 2;
![Uploading IS}]3IW`}1{XXX_(8YB{98F_078727.png . . .]

        isLowSpeed = false;
    }

其中isLowSpeed是為了防止同一怪物被反復(fù)減速客给,然后可以將減速幅度設(shè)為public類型,以便想要防御塔升級(jí)時(shí)加大減速幅度的朋友控制蜻拨。
另外還有激光槍桩引,噴火筒兩種,這里我將粒子特效掛在槍口休涤,并為粒子特效增加碰撞器笛辟,使其只檢測Enemy層敵人序苏。

噴火筒
加碰撞器

然后有兩種思路忱详,第一種是在CheckEnemy時(shí),判斷自己是否是激光槍监透,噴火筒(tag=“strong”)
然后監(jiān)測到敵人就向目標(biāo)放“特效”(用ParticleSystem my_PS航唆;my_PS.Stop();my_PS.Play();)控制。然后通過粒子碰撞器粪狼,將碰到的敵人扣除血量(可以用OnParticleCollisionStay判斷)。

第二種思路是我們偷懶想出的辦法再榄,特效照開不誤,但是用“隱形的”子彈和炮彈(激光單體嗅蔬,噴火群體)以很快的速度攻擊怪物(哈哈這樣就可以用舊代碼實(shí)現(xiàn)新功能了疾就,我好懶)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘪板,一起剝皮案震驚了整個(gè)濱河市侮攀,隨后出現(xiàn)的幾起案子厢拭,更是在濱河造成了極大的恐慌,老刑警劉巖供鸠,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楞捂,死亡現(xiàn)場離奇詭異,居然都是意外死亡胶坠,警方通過查閱死者的電腦和手機(jī)繁堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門椭蹄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罩润,你說我怎么就攤上這事埋酬∩斩埃” “怎么了拳球?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵祝峻,是天一觀的道長。 經(jīng)常有香客問我酬姆,道長奥溺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任相满,我火速辦了婚禮桦卒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘方灾。我一直安慰自己,他們只是感情好洞慎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布拢蛋。 她就那樣靜靜地躺著蔫巩,像睡著了一般圆仔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坪郭,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天歪沃,我揣著相機(jī)與錄音,去河邊找鬼沪曙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛碳默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘱根,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼巷懈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了柔逼?” 一聲冷哼從身側(cè)響起割岛,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎维咸,沒想到半個(gè)月后惠爽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡租副,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年较性,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片责循。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡院仿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出歹垫,到底是詐尸還是另有隱情,我是刑警寧澤吭敢,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布若贮,位于F島的核電站,受9級(jí)特大地震影響谴麦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舷蟀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一野宜、第九天 我趴在偏房一處隱蔽的房頂上張望魔策。 院中可真熱鬧,春花似錦闯袒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褪尝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恼五,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睬罗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓古涧,卻偏偏與公主長得像花盐,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子算芯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 無盡之塔角色圖鑒1 無盡之塔角色圖鑒2 無盡之塔鏈接1 無盡之塔鏈接2 游戲更新頻繁熙揍,且本文由代碼自動(dòng)生成,...
    z_fire閱讀 1,429評(píng)論 0 1
  • 法術(shù)有梆;亂魂釘、幽冥鬼火泥耀、天雷怒火蛔添、龍卷雨擊、三味真火作郭、落日熔金、龍騰水濺夹攒、 烈火驕陽、冥煙銷骨咏尝、九龍嘯天、九陰純火...
    空白_7閱讀 5,079評(píng)論 0 6
  • 現(xiàn)在我們來探討怪物的相關(guān)事宜:首先我們給怪物加一個(gè)EnemyContrl腳本胎食,用來儲(chǔ)存怪物的各種屬性以及尋路允懂,各種...
    貪狼大人閱讀 233評(píng)論 0 1
  • 下面,我們?yōu)橛螒蚣右稽c(diǎn)變數(shù)——天氣最初的設(shè)想為晴天時(shí)粥航,火焰·炮彈防御塔正常運(yùn)行,弩箭·激光武器威力加1/2柄延,冰塔減...
    貪狼大人閱讀 378評(píng)論 2 2
  • 在和群友聊天時(shí)缀程,突發(fā)靈感,原來我最近是在玩碼字游戲杨凑,說是寫作太牽強(qiáng),碼字最貼切僵刮。因?yàn)槊刻煲獙?00...
    一哈哈兒閱讀 683評(píng)論 2 1