創作內容

9 GP

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

作者:雪藏│2014-07-01 01:06:28│巴幣:18│人氣:4489
上一篇介紹了物件移動,這次來介紹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吧


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

引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2494774
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 1 篇留言

vc
那個Move()的第一行 float attackDistance = Vector3.Distance ( m_cebe.transform.position - m_AttackTargetPosition )
應該不是減號吧,因為我這樣打會Error,應該是頓號吧(?

07-07 11:00

雪藏
嗯, 那個地方我有修正, 但圖沒改, 程式碼以我的原始碼為準07-07 12:14
我要留言提醒:您尚未登入,請先登入再留言

9喜歡★andy1214 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:遊戲程式設計與Unity... 後一篇:遊戲程式設計與Unity...

追蹤私訊切換新版閱覽

作品資料夾

lin881205大家
小屋不定期更新冷門西洋歌曲推廣與Reddit鬼故事翻譯唷!看更多我要大聲說3小時前


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

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