星期一, 3月 29, 2010

[UDK教學] [第十五章] 試著控制Bot看看

Bot的瞄準是無懈可擊的,而且還會不停對玩家連射。雖然邊躲邊移動還是不太會被射到,可是只要回擊或者是停下來就會被射死。現在是不會動,但是總覺得哪裡怪怪的。

我們還是調整一下讓他攻勢不要這麼兇猛吧。

我們繼續在Start Firing At那裏的設定,按下滑鼠右鍵加入「新建動作」→「AI」→「Stop Firing」。由於主體是系統產生的Bot,所以Target參數就跟Start Firing At一模一樣就好了。



從Start Firing At 的「Out」拉線出來,連在StopFiring的「In」上。Stop Firing的「Out」連到Start Firing At 的「In」上。

把停止用的機制連上去

讓瞄準的設定從這個位置回來吧

在這裡把兩個「Out」的黑色連接點的地方按滑鼠右鍵,選擇「設置有效延遲」。在這裡我們把Start Firing At的Out設為0.5秒,Stop Firing的Out設為1.5秒吧。這邊與其說是Delay,還不如說是這邊Kismet的處理讓它持續動作的時間還比較恰當。

從「Out」的位置上,設定處理這段AI的時間



現在就會0.5秒射擊,然後1.5秒鐘休息,這樣的話就多少減緩了一些攻勢了。

但是1.5秒休息然後0.5秒攻擊這樣的迴圈,即使Bot死掉了依然是會繼續執行,把Bot打死以後畫面就會持續出現警告訊息。此時我們需要加入可以判斷Bot死亡的機制。

Bot死掉以後,攻擊開始及停止的程序一到就會出現黃色的錯誤訊息

我們現在來準備可以表示Bot狀態的變數,Bot產生的時候變數為1,Bot死掉的時候就不為1。這樣的話就可以執行「射擊迴圈如果在Bot狀態不為1的情況下就不會被執行」這樣的判定。

如果各位有看Tutorial Video的話,Bot的數量是在ActorFactory的Spawn Count裡遞增的樣子,在這裡我們想要做一個int(整數)的變量,Pawn(在西洋棋是指卒、兵的意思)如果死掉的話值就會變成-1,並且把值寫回變量裡去。嘗試的做了一下,但是在這裡Spawn Count好像沒有進行遞增的動作,所以我們就把1硬寫進去(雖然這樣子跟Actor連接在一起是沒什麼意義啦....)

雖然從這邊長出變量感覺有點多餘,可是以防萬一還是把整數1加上去吧。

初始值設為1

Bot被破壞之後,變量就要減1。

加減運算的話,「新建動作」→「Math」→「Add Int」就可以執行。條件的判斷的話,「新建條件」→「Comparison」→「Compare Int」就可以對整數進行比較。
問題是,要如何讓Kismet判定Bot的死亡這件事情。

「新建事件」→「Pawn」→「Death」這個事件似乎可以判斷的樣子,總之先接接看再說吧。

用這個功能來判斷Bot是否死亡(應該....)


為了可以使用減法運算,我們把加法運算的kismet加進去

連接判斷Bot死亡的處理

指定要做減法運算的對象

加入要做為減數的變量

把變量值設為-1,這樣就會由加法變成減法

加入判斷是否死亡的判斷式



如果想要把線拆掉重接得話,就要在連接器凸起上面按滑鼠右鍵選擇「斷開連接至」→連接位置

把線重新接到整數比較用的Kismet元件的左邊


另外一邊變量B的地方放入要比較的值(設為0)


最後照上圖連接好後,雖然希望他可以照我們想的方式執行,可是實際上並沒有動作....

光是指定好像沒辦法啟動Death的事件的樣子。而且Death事件也沒辦法指定Target,所以也沒別的辦法。

基本上Kismet在關卡開始製作時會用到的Object,在那個Object自選單點選產生後,那個Object就可以指定成為事件的起始點。而這次的教學,在遊戲開始後動態產生的Object,就需要動態生成Bind變量才行。

被產生的Bot要添加事件的話,須追加下列動作「新建動作」→「Event」→「Attach To Event」,把不知去向的事件撿回來。這裡我們就把Attach To Event的「In」接到Actor Factory的「Finished」上去。

要啟動Pawn的Death判斷事件的話就必須要生成Attach to event事件才行

把Attach to Event 「In」接到Actor Factory的「Finished」上

接下來,「Attachee」的部分跟Bot Object(圓圈內是???那個)連接在一起。然後,從「Event」把線拉出來,接到Death的頭的部分上。連接器接到不是另一個連接器的方式,是我們之前都沒有用過的方法。

從事件原點變量???上把線接到Attachee上

從Event拉出來的線,接到Death事件的頭上,這樣就完成了

稍微一看就可以了解,運算的主要流程是用黑線連接,Object的指定/分配指派是由洋紅 色的線,整數值是用青色的線。紅色的線的話就是事件。整體來看,Kismet東西找的不方便,Debug也很辛苦。特別設計成視覺化程式語言環境感覺好像也意義不大的樣子。

總之,像這樣利用Kismet邊做邊嘗試錯誤的話,某種程度上來說我們也可以讓Bot變的比較聰明一點。但是對於那些覺得者些嘗試很麻煩的人,UDK還是有準備懶人包給他們。

在actorFactory要生成Pawn的時候如果把「Force Death Match AI?」的選項勾選起來的話,Bot就會套用UT3內的死鬥模式AI了。雖然UnrealEngine可以對AI做更細緻範圍更廣的設定,不過在習慣Kismet的邏輯跟用法之前這個是個相當便利的東西阿。

1 則留言:

  1. 光是指定好像沒辦法啟動Death的事件的樣子。而且Death事件也沒辦法指定Target,所以也沒別的辦法。 
    -->

    不知道為什麼,我設定到這邊,試了一下就可以把BOT殺死了耶!?XD

    截圖畫面: http://images.plurk.com/d867acec7cc10237e48740adcb656bbc.jpg

    回覆刪除

如果您對於此篇文章有意見、問題、想法、或者是吐槽格主寫的太爛,都可以寫在這個地方告訴格主喔:D:D