iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0

延續前一天的怪物的功能,今天要說的是尖刺怪的攻擊要如何來實現。

一開始要在Enemy的物件下加上一個子物件名為EnemyAttack,它的Inspector裡會需要一個Collider,我這邊使用的是CircleCollider2D,主要是用來判斷怪物是否進入到攻擊範圍內,要特別注意的是,這個Collider的目的不是碰撞,而是判斷範圍,所以要記得把Is Trigger打勾,這樣才可以避免怪物與主角的碰撞。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414d9NqGnr9Xd.jpg

尖刺怪的攻擊方式為向上跳躍同時捲曲身體,身體上還會長出刺,最後加速向下重擊在主角的身上,光是思考攻擊過程中的速度變化,以及動作要合乎物理,我個人是覺得使用程式來實現有點太複雜,所以最後決定偷吃步,利用動畫來實現怪物的動作變化,另外在動畫裡還會加上怪物重擊地板會濺起灰塵。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414nOUDbsQife.jpg

在enemyattack動畫裡,我加入了Position的屬性來控制怪物向上跳及向下重擊的位置變化,dust則是放在enemy底下的子物件,也就是重擊而濺起的灰塵,此物件裡面也會放dust的動畫,那在enemy的動畫裡是控制它是否為Active,這樣就可以實現怪物攻擊的動作囉!


接下來就要進入到程式的部分,首先我們一樣要設定一些變數

  • attackDamage,怪物攻擊時,主角受到傷害的數值
  • attackDelay,怪物攻擊的間隔時間
  • elapsed,計算攻擊間隔時間的變數
  • canAttack,怪物是否可以進行攻擊了
  • attackTarget,判斷是否有攻擊目標
  • Attack_Wait,判斷是否為攻擊的間隔等待時間

https://ithelp.ithome.com.tw/upload/images/20200914/20130414BXH8TEFMOw.jpg

還記得我們剛剛在怪物身上又加上一個Collider了嗎?現在我們要藉由它來判斷主角是否進入攻擊範圍內,程式中所使用的是OnTriggerEnter2DOnTriggerExit2D,如果主角進入到怪物身上的攻擊Collider,就會將attackTarget設定為主角的gameObject,相反地,若主角離開了Collider範圍,attackTarget則為null。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414X7yjCnQBbN.jpg

再來我們要寫一個攻擊的函式,將它命名為Attack,函式裡首先需要判斷條件是否成立,才會進行攻擊的動作,那這裡是設下了三個條件,分別是在可以攻擊的狀態下、attackTarget是有目標的,而且怪物沒有在冷卻的情況下才可以攻擊主角,條件都成立後,就可以播放攻擊的動畫,並將canAttack設為false。
https://ithelp.ithome.com.tw/upload/images/20200914/2013041499xzZeq5Bd.jpg

攻擊之後當然要讓主角扣血,所以我們接著要寫一個Damage的函式,看到下方有一行程式為MyInpulse.GenerateImpulse();,它是控制攝影機有晃動的感覺,因為當怪物向下重擊時,我們想要加強它的重擊力道,所以使用攝影機晃動來達到這個效果,然後就是判斷attackTarget是否有攻擊目標,如果有的話就會去抓主角身上的腳本PlayerControl,有一個函式名為TakeDamage,其中的參數由我們所設定的attackDamage變數來控制主角的扣血數值,最後這個Damage函式是掛在怪物攻擊的動畫裡面,當怪物向下重擊的那個瞬間,就會呼叫此函式。
https://ithelp.ithome.com.tw/upload/images/20200914/20130414FcTSdY2Yf3.jpg

函式都寫好之後,就要在Update裡呼叫函式,讓怪物可以正常運作。那我們看向下方的程式碼,首先我們需要將變數在什麼情況是什麼狀態先設定好,那還記得上面有說到我們的攻擊是有時間間隔的嗎?所以當計算時間間隔的變數elapsed還小於攻擊間隔時間AttackDelay時,就會讓elapsed開始計時,若elapsed大於AttackDelay就代表怪物可以進行攻擊了,因此就將canAttack變數設為true、elapsed要重新開始計時,還有此時並不處於攻擊等待時間,再來就可以呼叫Attack函式了,另外,還有一個情況要加進Update裡面,也就是當attackTarget沒有攻擊目標時,怪物就不會進行攻擊,當然也不會有攻擊的等待時間,所以我們要將Attack_Wait設定為false,這樣今天怪物攻擊功能的任務就完成囉!
https://ithelp.ithome.com.tw/upload/images/20200914/20130414qKfK68ZJLU.jpg


上一篇
[Day17]尖刺怪-追蹤主角、受傷
下一篇
[Day19]尖刺怪-死亡與復活
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言