UE4 AI Perception 淺析

年紀老了,記憶力差,隨手寫點筆記,以後忘了再來翻翻。


從用途說起吧,當一個AI需要偵察周圍的是否有敵人或者隊友什麼的,就需要用到AIPerception了,通俗的說它可以決定這個AI的視力,聽力等。


首先需要配置AIController的成員變量PerceptionComponent,主要配置的東西是UAIPerceptionComponent::SensesConfig,它是一個TArray,可以配置視力、聽力的相關參數,具體有哪些可以配置,參考UAISenseConfig,和它的子類UAISenseConfig_Sight,UAISenseConfig_Hearing,還有一些其他類型的子類,比如受到傷害什麼的,我就不一個一個分析啦。


到這裏就算配置成功了,當AI如你定義的參數,看到敵人時UAIPerceptionComponent就會拋出事件告訴你,當感知到任何變化的時候UAIPerceptionComponent::OnPerceptionUpdated都會調用,UAIPerceptionComponent::OnTargetPerceptionUpdated這個事件會告訴你具體哪個玩意進入了這個AI的感知系統。


使用上來說,就這麼多,下面分析一下內部的運行機制。

先說一下UAIPerceptionSystem,這個包含於UAISystem的實例,管理所有的與AIPerception相關的東西。


當一個Actor包含UAIPerceptionComponent組件時就會註冊到UAIPerceptionSystem,作爲一個FPerceptionListener緩存在UAIPerceptionSystem::ListenerContainer裏,同時這個UAIPerceptionComponent::SensesConfig使用的所有UAISense也都會緩存在UAIPerceptionSystem::Senses裏,相關代碼的入口在UAIPerceptionComponent::OnRegister。


在UAIPerceptionSystem::Tick的流程裏,會先遍歷Senses,執行UAISense::ProgressTime,算是一步優化,當確定需要更新時再遍歷ListenerContainer執行FPerceptionListener::CacheLocation和UAISense::Tick,確保以AI最新的位置爲基礎更新感知系統。(這裏着重說一下,再UAISense::Tick裏會調用UAISense::Update,拿UAISense_Sight::Update來說,這裏就是一個視力感知邏輯真正實現的地方,判斷其他的Actor是否再當前配置的視野範圍內。)最後就是遍歷ListenerContainer調用UAIPerceptionComponent::ProcessStimuli了,遍歷所有的刺激源UAIPerceptionComponent::StimuliToProcess,判斷這些個刺激源與已緩存的刺激源信息UAIPerceptionComponent::PerceptualData是否發生了改變,如果有改變就會調用前面提到的兩個delegate(OnPerceptionUpdated,OnTargetPerceptionUpdated)。


到這裏流程差不多就分析完了,還有一些具體的功能只是路過看來一下,還有去擼哪些代碼,比如FDelayedStimulus,



如果你也在看這塊,希望你能和我一起分享


UPawnSensingComponent, 這貨也實現了類似的功能, 但是Epic表示不會再更新了,因爲不夠靈活和性能差

https://answers.unrealengine.com/questions/437818/pawn-sensing-vs-ai-perception.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章