PerceptionSystem
2025-01-05 11:29:15 0 举报
UE感知系统源码分析
作者其他创作
大纲/内容
UAISense_Sight
视觉感知:感知视野范围内所有的游戏对象,并将感知到的对象计分排序
// 将OwnerActor注册给对应的SenseUAIPerceptionStimuliSourceComponent::OnRegister()
FAIStimulus
UAISense::Tick() // TimeUntilNextUpdateUAISense_Sight::Update() // AI感知规则具体实现
UAIHotSpotManager
PerceptionSystem处理当帧刺激源,将刺激源注册给对应的Sense感知频道
UAIPerceptionSystem::RegisterSource(); // 注册到SourcesToRegister缓冲容器
AISense:感知频道更新感知Listener
FPerceptionListener
FStimulusToProcess
UAISense::OnListenerUpdate()
OnRegister()
UAIPerceptionSystem
# FListenerMap ListenerContainer; Listener列表# TArray<TObjectPtr<UAISense>> Senses; 不同类型感知能力列表,感知频道
UAIPerceptionComponent::OnPerceptionUpdated(UpdatedActors)
UAIPerceptionComponent::ProcessStimuli()
AIPerceptionSystem
Sense::ShouldAutoRegisterAllPawnsAsSources
AIPerceptionComponent::OnRegister()
感知Sense在RegisterEvent()接口中将注册的Event收集起来,之后在Update中处理
UAISubSystem
PerceptionSystem根据Event的感知类型将Event注册给对应感知Sense
SourceActor
UAISense::OnListenerRemoved()
UAISense_Hearing::RegisterWrappedEvent(UAISenseEvent)
FPerceptionListener处理当前刺激源
UAISystem
AI系统,管理一系列AISubSystem
Senses计算更新,将不同感知类型的刺激事件分发给对应的AIPerceptionComponent处理;UAIPerceptionSystem::DeliverDelayedStimuli() // 延迟触发的刺激源
UAISense_Prediction
一定时间内根据刺激源的速度计算预测位置发送给监听者
AIPerceptionSystem::OnListenerUpdate()
UAISystem::OnActorSpawned(AActor* SpawnedActor)
UAISense::OnNewListener()
AISense
UAISense_Touch
碰撞接触触发感知
AAIController::ActorsPerceptionUpdated(UpdatedActors)
外部调用PerceptionSystem的OnEvent()或ReportEvent()接口发起一个感知源事件
感知监听者注册:
UAIPerceptionSystem::ReportEvent(UAISenseEvent);
AIPerceptionSystem:感知系统更新Listener
UAIPerceptionSystem::PerformSourceRegistration() //Tick时机更新刺激源
UAIPerceptionComponent
# TArray<UAISenseConfig*> SensesConfig; // 配置使AIController具有不同的感知能力# TSubclassOf<UAISense> DominantSense; // 主感知,优先决定感知到的Actor的位置# AAIController* AIOwner;# TArray<FStimulusToProcess> StimuliToProcess; // 当前马上要处理的刺激源# TArray<float> MaxActiveAge; // Stimulus活跃的有效时长- FActorPerceptionContainer PerceptualData; // 成功感知到的SourceActor数据+ OnRegister(); // 将自身作为Listener注册给感知系统的Sense+ OnUnregister();span style=\"font-size:inherit;\
感知系统处理分发:
Sense感知频道计算过更新,并将计算得到的Stimuli刺激分发给对应的Listener处理
UAIPerceptionSystem::MakeNoiseImpl()
UAISense
定义组织一种感知类型,合批处理该感知下的所有感知对象每种Sense负责接收所有当前感知类型的Event事件,如果Event的受体本身也注册了当前感知类型,则进行计算之后将Event信息封装成FAIStimulus注册给该受体感知者去处理- UAIPerceptionSystem PerceptionSystemInstance;- FAISenseID SenseID;+ bool ShouldAutoRegisterAllPawnsAsSources();// 当前Sense是否自动注册所有新Pawn作为SourceActor+ RegisterSource(AActor& SourceActors);+ UnregisterSource(AActor& SourceActors);+ RegisterWrappedEvent(UAISenseEvent& PerceptionEvent); // Event注册,子类必须重写进行处理+ bool WantsNewPawnNotification(); // 当前Sense是否关心Pawn出生事件# OnNewPawn(APawn& NewPawn); // WantsNewPawnNotification()==true时触发- float TimeUntilNextUpdate; // Update更新时长+ Tick();# Update(); // 每隔TimeUntilNextUpdate更新一次,子类Sense具体实现感知规则# OnNewListenerDelegate;# OnNewListenerUpdateDelegate;# OnNewListenerRemovedDelegate;
UAIPerceptionSystem::OnEvent(FEventClass)
UAISense_Hearing
听觉感知:将声音源的位置、音量等信息同步给监听者,同时会考虑声音传播速度,将刺激延迟同步给监听者
UAISense_Hearing::Update() // for in NoiseEvents
AI感知系统
UAIPerceptionSystem::RegisterSourceForSenseClass(); // 此时如果Sense还没初始化则立即创建
+ OnPerceptionUpdated();+ OnTargetPerceptionForgotten();+ OnTargetPerceptionUpdated();+ OnTargetPerceptionInfoUpdated();
UAISense_Damage
伤害事件的管理转发
UAISense_Hearing::RegisterEvent(FAINoiseEvent)
UAIPerceptionSystem::OnNewPawn(APawn& Pawn)
UAIPerceptionComponent::OnTargetPerceptionUpdated
Listener对应的AIPerceptionComponent处理当帧监听到的刺激,并分发对应刺激事件
AIPerceptionSystem::UpdateListener()
FActorPerceptionInfo
UNavLocalGridManager
AAIController
感知组件是一种ActorComponent,挂在AIController上
AIPerceptionSystem::OnNewListener()
UAIPerceptionStimuliSourceComponent:实际将SourceActor注册给感知系统
感知源注册:
AIPerceptionComponent:监听者激活将自己注册到感知系统
UActorComponent
+ OnComponentActivated();+ OnComponentDeactivated();
UEnvQueryManager
环境查询系统EQS
UBehaviorTreeManager
行为树
*AIPerceptionSystem::UnregisterListener()*AIPerceptionSystem::OnListenerRemoved()
UAISense_Team
感知广播范围内的队友,将事件同步给队友
UAISenseConfig
FString CachedSenseName;float MaxAge;
UAIPerceptionStimuliSourceComponent
非视觉感知源需要通过这个组件将自身作为感知源注册到不同的感知Sernse频道中# TArray<TSubclassOf<UAISense> > RegisterAsSourceForSenses;# OnRegister();+ RegisterWithPerceptionSystem();+ UnRegisterWithPerceptionSystem();+ RegisterForSense(UAISense);+ UnregisterFromSense(UAISense);
定义组织一种感知类型,合批处理该感知下的所有感知对象- FAISenseID SenseID;+ RegisterSource(AActor& SourceActors);+ UnregisterSource(AActor& SourceActors);# Update();
UAIPerceptionSystem::Tick()
UAIPerceptionSystem::PerformSourceRegistration() // 感知源注册到Sense感知频道UAIPerceptionSystem::AgeStimuli() // Listener已有刺激衰减更新或移除过期Listener;
UAIPerceptionComponent::OnTargetPerceptionInfoUpdated
Pawn::StartPlay()
SenseEvent注册(声音事件为例):
收藏
0 条评论
下一页
为你推荐
查看更多
抱歉,暂无相关内容