1. 程式人生 > >AI概念分析

AI概念分析

有變 wan tsa enc 存在 clas aip 存檔 引用

設計的本質是抽象變化。

關於Composites的用法又有了新的認識:在Task返回值的時候盡量要與真實情況相符合,就像Selector下的子節點一旦成功Selector就返回,說明Selector是一種選擇的方式,而Sequence下的子節點一旦失敗就返回,說明它就是用來一步一步執行的。所以在選擇使用的時候盡量按照規矩來,減少強制性的返回結果,這樣顯得更和諧,別人讀程序也更好懂。

技術分享

上面是整個AI系統中的工具。

Pawn Action

也是要在AIController中運行的,有兩個特點,Action Tree是動態創建的,2是執行結束後就被釋放了。

用處:將一些行為封裝成起來可以供很多不同的目標使用。

使用方法:創建一個基於PawnAction_BlueprientBase的類,在其中有5個事件驅動,常用的就是EventActionStart/Tick/Finished,如何判定是要執行Finish呢,有一個節點使用:Finish,並且還可以返回Result。那現在類是有了,將一些AI事件放在這裏寫,如何去實現呢,這個類只能在有特定的Compontent的下執行,是ActionsComp,這個組件存在於AIController中,所以類的實現在其中寫,首先要創建一個Action,用節點CreatActionInstance,創建出來只是將其放在棧中,還需要將其從棧中調出,至於何時調出根據需求,調出有兩個節點可以使用,PushAction和PerformAction。當然最後要將AICON幫到目標身上才能觸發。

當然,還有abortAction打斷節點。

技術分享

SaveGame

將遊戲記錄存下來應該是在遊戲進行的最高邏輯中寫,GameInstance。

GameInstance中有一個Init初始化事件,這是最適合寫存檔的地方。

創建一個基於SaveGame的類,這個類的主要作用是存儲數據。所以不需要寫任何邏輯,只需要將需要存儲的變量添加上就Ok。等待別的地方對變量賦值。

接下來在GameInstance中寫邏輯,復寫一個Event Init的函數,鏈接LoadGameformSlot節點,意思是從Slot中載入遊戲,Solt中放有什麽呢,我們要把遊戲的檔案放在Slot中,這樣就會一開始的時候從Slot中調用檔案了,節點的返回值就是遊戲的檔案,這裏的遊戲檔案就是SaveGame的類,這裏做一個類型轉換,如果第一次進入遊戲,這是還沒有存過檔,那麽一定會轉換失敗,失敗之後就要創建一個檔案了,CreatSaveGameObject,創建一個存儲遊戲的對象,並將其付給剛創建的類的引用,使其實例化。如果之前想打開之前有過的存檔,那麽就會轉化成功,成功之後將打開的遊戲檔案再付給引用,將其實例化。這是進入和創建遊戲檔案的邏輯。

技術分享

下面要寫的是如何將數據存在遊戲檔案中,更新數據一定要對對象更新,不能對引用更新,所以在Instance中的引用是被實例化了的,故可以對其更新數據,進行數據賦值,賦值形式根據需求自定,這裏我只做了一個很簡單的賦值。

技術分享

或許很疑惑這裏為什麽還有一個Instance中的函數,理論上說我們已經完成了將數據存入檔案,一開始調用檔案的事情了。但是別忘了,調用檔案,是從Slot中調用的,所以我們還必須要將檔案在存儲進Slot中的,否則調用的還是上一次放在Slot中的檔案。那既然是要把改變好的檔案放在Slot中,那還是要在Instance中放的,因為只有Instance中有被實例化的檔案引用。但是存儲的驅動有不能再Instance中,故寫成函數,由其他地方調用。這樣才完成了遊戲存檔。

梳理一下思路,基於SaveGame的類就是一本遊戲檔案,其中只有變量。類是創建好了,那麽下面要創建出對象,CreatSaveGameObject,那這個創建的邏輯要在Instance中寫了,並將創建好的提升為變量,供其它使用。UE的機制是不能直接打開存檔,而是要從Slot中打開檔案,要想打開檔案就要用LoadGameformSlot,要是第一次開遊戲的話需要創建,第二次就直接打開已有的存檔就OK了,即使是打開了,也需要將打開的存檔提升為變量,以備更新信息時用。故有了Instance中的邏輯。那麽既然要從Slot中打開遊戲檔案,那麽我們在將數據存檔的時候就要將檔案放在Slot中,那麽最後就是更新數據了,這裏很簡單的信息交互就不說了。

技術分享

Sensing

Register登記,註冊 perception感知 stimuli刺激

這裏存在兩個感知系統,其中AIPerception是老的感知系統,也是比較完善的,雖然會被淘汰,但那時還是需要了解的,新的系統是PawnSensing。先說AIPerpection.

AIPerception

首先在AIController中添加一個AIPerception,並在Detail面板中找到AIPerception對其進行編輯,Configuration布局,結構。Dominant主要的,顯性的。

添加一個elements,例如添加一個Hearing,對Sense面板進行修改達到自己要的效果,Implementation工具,Affiliation加入,入會,聯系Detevtion by Affiliation探測的目標——敵人,中立,朋友。MaxAge聽完之後多久忘掉,還有一個LoSHearingRange多遠聽不到了

如果是視覺的話還有一個視覺角度。

設置好之後會發現在Variables中的Components有一個AIPerception,在Detail面板中有事件可以進行編輯,

技術分享

一般用到前兩個,當感知更新時執行事件,那這個檢測的任務就交給了引擎,較於之前的方法,我們就不需要進行監測了,那執行的事件很明了就是要更新黑板上的數據。這裏的兩個驅動有不同的地方,就是沒有Target的驅動是可以對多個AI,後者只是針對一個。

事件執行後,我們仍要進行判定,判斷是一旦受到刺激就執行事件,還是守到某種特定的刺激執行特定的事件。這裏用到節點GetSenseClassForStimulus(獲得產生刺激的感知類)之後跟判定ClassIsChildOf。

技術分享

Array的遍歷主要是想獲得Srimulus(刺激)進行判定。先是獲得元素的Perception,接著將其Break獲得Stimulus數組,再進行遍歷,將元素Break進行判定。

技術分享

第二種就是對其單個感知的改變進行判定,獲得發生刺激的感知類,之後判斷是不是繼承自需要的感知類。

如此結束了麽,這裏有這麽個問題就是這個感知系統的弊端,AIPerception負責接收刺激,還必須有人發出刺激,這就是AIPerceptionStimuliSource組件的作用。在目標中添加此組件,在Detail面板中的AIPercetion勾選Auto Register as Source才可以產生將刺激發出的作用,並在Register as Source for Senses中添加需要發出的刺激。還有一點需要註意,對於聽覺而言,動畫中的聲音對於場景中的Actor是聽不到的,所以即使發出了聽覺刺激還是沒有聲音的,這裏就要讓場景中的Actor也可以擁有一個聲音的刺激。利用節點MakeNoise,和PawnMakeNoise。兩者有一點不同,NoiseMaker(聲音制造者)NoiseInstigator(聲音煽動者)。

制作一個聲音刺激,什麽時候發出呢,當然是要跟動畫聲音的產生同步的,在動畫中創建一個Notify。如此才算完成。

Pwan Sensing

在前面闡述過。

AI概念分析