上一篇介紹了物件移動,這次來介紹AI。
建立一個Cube,當做要攻擊的目標,並放在適當的位置,並把原來的Cube加上一個Box Collider的Component
建立一個物件跟script,並取名為TowerManage,並把script附加上去
再來打開TowerManage這個script,它是我們攻擊目標的script,所以要加上血量跟一些方法
我設定了兩個變數,一個是被攻擊目標的血量,一個是連結到被攻擊的目標,然後還有三
個方法,一個是送入傷害的方法,一個是取得被攻擊目標目前的血量。送入傷害的方法裡有用來扣除血量的程式碼,有些人可能把扣傷害的判斷寫在攻擊者那邊,那我是建議最好是把判斷寫在被攻擊方裡,這樣程式碼有變動時,不用一次改兩邊,只需要透過同樣名稱的函數即可,裡面有一行m_Tower.SetActive(false);這是把物件關閉的方法( Scripting API),而傳回目前血量的方法,可以用來做一些判斷,最後一個方法會回傳被攻擊物的座標。這部分完成後再來打開CubeController,加入AI的程式碼m_Cube.collider.bounds.size.x;
這個方法可以取得物件身上的碰撞器的大小( Scripting API),我用Cube上面的Box Collider的直徑來當做我的攻擊距離,因為collider是可見的,所以來拿當判斷用的距離還滿方便的我在Update()裡用一個switch(){}(
switch (C# 參考))的陳述式來執行目前的狀態,並把原先移動的程式碼搬到一個Move()這個function裡,讓程式碼看起來簡潔一點
檢查被攻擊目標跟方塊之間的距離,如果距離小於方塊的攻擊距離就切換到攻擊模式
我加入兩個變數來代表攻擊速度跟攻擊傷害,然後用Invoke(
Scripting API)來依攻擊速度調用Attck()這個方法,但在調用Invoke之前,先用IsInvoke(
Scripting API)判斷Attack()是否正在調用中,如沒有才呼叫Invoke。在Attack()這個function裡,我傳送傷害給攻擊目標,並檢查攻擊目標血量是否已歸零,如歸零就改變狀態成Idle。
儲存後,回到Unity視窗並把需要的連結拉一拉,然後按下執行鍵,並觀察Console內的訊息,
你也可以把攻擊目標換一下位置,看看會有什麼不一樣的表現
這次的AI介紹,有用上簡單的FSM(有限狀態機)來變換AI的行為,學起來,幫你的角色加上AI吧
遊戲程式設計與Unity3D引擎初步認識(九)