小屋創作

日誌2014-07-01 01:06

遊戲程式設計與Unity3D引擎初步認識(八)

作者:雪藏

上一篇介紹了物件移動,這次來介紹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是可見的,所以來拿當判斷用的距離還滿方便的

我用一個列舉(enum (C# 參考))來代表AI的各個狀態,並用一個變數儲存AI目前的狀態

我在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吧

GitHub原始碼下載
https://github.com/andy1214/UnityProjects

遊戲程式設計與Unity3D引擎初步認識(九)
http://home.gamer.com.tw/creationDetail.php?sn=2498384

9

1

LINE 分享

相關創作

【yotoo】240504

【亞夜玩遊戲】《皇冠之心 Online》搶先體驗版

【yotoo】240505

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】