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

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