延續前一天的怪物的功能,今天要說的是尖刺怪的攻擊要如何來實現。
一開始要在Enemy的物件下加上一個子物件名為EnemyAttack,它的Inspector裡會需要一個Collider,我這邊使用的是CircleCollider2D,主要是用來判斷怪物是否進入到攻擊範圍內,要特別注意的是,這個Collider的目的不是碰撞,而是判斷範圍,所以要記得把Is Trigger
打勾,這樣才可以避免怪物與主角的碰撞。
尖刺怪的攻擊方式為向上跳躍同時捲曲身體,身體上還會長出刺,最後加速向下重擊在主角的身上,光是思考攻擊過程中的速度變化,以及動作要合乎物理,我個人是覺得使用程式來實現有點太複雜,所以最後決定偷吃步,利用動畫來實現怪物的動作變化,另外在動畫裡還會加上怪物重擊地板會濺起灰塵。
在enemyattack動畫裡,我加入了Position的屬性
來控制怪物向上跳及向下重擊的位置變化,dust則是放在enemy底下的子物件,也就是重擊而濺起的灰塵,此物件裡面也會放dust的動畫,那在enemy的動畫裡是控制它是否為Active,這樣就可以實現怪物攻擊的動作囉!
接下來就要進入到程式的部分,首先我們一樣要設定一些變數
attackDamage
,怪物攻擊時,主角受到傷害的數值attackDelay
,怪物攻擊的間隔時間elapsed
,計算攻擊間隔時間的變數canAttack
,怪物是否可以進行攻擊了attackTarget
,判斷是否有攻擊目標Attack_Wait
,判斷是否為攻擊的間隔等待時間還記得我們剛剛在怪物身上又加上一個Collider了嗎?現在我們要藉由它來判斷主角是否進入攻擊範圍內,程式中所使用的是OnTriggerEnter2D
和OnTriggerExit2D
,如果主角進入到怪物身上的攻擊Collider,就會將attackTarget設定為主角的gameObject,相反地,若主角離開了Collider範圍,attackTarget則為null。
再來我們要寫一個攻擊的函式,將它命名為Attack,函式裡首先需要判斷條件是否成立,才會進行攻擊的動作,那這裡是設下了三個條件,分別是在可以攻擊的狀態下、attackTarget是有目標的,而且怪物沒有在冷卻的情況下才可以攻擊主角,條件都成立後,就可以播放攻擊的動畫,並將canAttack設為false。
攻擊之後當然要讓主角扣血,所以我們接著要寫一個Damage的函式,看到下方有一行程式為MyInpulse.GenerateImpulse();
,它是控制攝影機有晃動的感覺,因為當怪物向下重擊時,我們想要加強它的重擊力道,所以使用攝影機晃動來達到這個效果,然後就是判斷attackTarget是否有攻擊目標,如果有的話就會去抓主角身上的腳本PlayerControl,有一個函式名為TakeDamage,其中的參數由我們所設定的attackDamage變數來控制主角的扣血數值,最後這個Damage函式是掛在怪物攻擊的動畫裡面,當怪物向下重擊的那個瞬間,就會呼叫此函式。
函式都寫好之後,就要在Update裡呼叫函式,讓怪物可以正常運作。那我們看向下方的程式碼,首先我們需要將變數在什麼情況是什麼狀態先設定好,那還記得上面有說到我們的攻擊是有時間間隔的嗎?所以當計算時間間隔的變數elapsed
還小於攻擊間隔時間AttackDelay
時,就會讓elapsed開始計時,若elapsed大於AttackDelay就代表怪物可以進行攻擊了,因此就將canAttack變數設為true、elapsed要重新開始計時,還有此時並不處於攻擊等待時間,再來就可以呼叫Attack函式了,另外,還有一個情況要加進Update裡面,也就是當attackTarget沒有攻擊目標時,怪物就不會進行攻擊,當然也不會有攻擊的等待時間,所以我們要將Attack_Wait設定為false,這樣今天怪物攻擊功能的任務就完成囉!