UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
AIPerceptionSystem.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Stats/Stats.h"
9#include "UObject/Object.h"
11#include "Engine/EngineTypes.h"
12#include "Engine/World.h"
14#include "Perception/AISense.h"
15#include "AISubsystem.h"
16#include "AIPerceptionSystem.generated.h"
17
20class UAISenseEvent;
21
23
24class APawn;
25
29UCLASS(ClassGroup=AI, config=Game, defaultconfig, MinimalAPI)
31{
33
34public:
35
37
38 // FTickableGameObject begin
39 AIMODULE_API virtual void Tick(float DeltaTime) override;
40 AIMODULE_API virtual TStatId GetStatId() const override;
41 // FTickableGameObject end
42
43protected:
45
46 UPROPERTY()
48
49 UPROPERTY(config, EditAnywhere, Category = Perception)
50 float PerceptionAgingRate;
51
52 FActorEndPlaySignature::FDelegate StimuliSourceEndPlayDelegate;
53
54 // not a UPROPERTY on purpose so that we have a control over when stuff gets removed from the map
55 TMap<const AActor*, FPerceptionStimuliSource> RegisteredStimuliSources;
56
57 uint32 bHandlePawnNotification : 1;
58
66
68
70 {
73
75 : SenseID(InSenseID), Source(SourceActor)
76 {}
77
79 {
80 return SenseID == Other.SenseID && Source == Other.Source;
81 }
82 };
84
85public:
86
87 inline bool IsSenseInstantiated(const FAISenseID& SenseID) const { return SenseID.IsValid() && Senses.IsValidIndex(SenseID) && Senses[SenseID] != nullptr; }
88
90 AIMODULE_API void UpdateListener(UAIPerceptionComponent& Listener);
91 AIMODULE_API void UnregisterListener(UAIPerceptionComponent& Listener);
92
93 template<typename FEventClass, typename FSenseClass = typename FEventClass::FSenseClass>
95 {
96 const FAISenseID SenseID = UAISense::GetSenseID<FSenseClass>();
97 if (Senses.IsValidIndex(SenseID) && Senses[SenseID] != nullptr)
98 {
99 ((FSenseClass*)Senses[SenseID])->RegisterEvent(Event);
100 }
101 // otherwise there's no one interested in this event, skip it.
102 }
103
104 template<typename FEventClass, typename FSenseClass = typename FEventClass::FSenseClass>
106 {
107 if (Events.Num() > 0)
108 {
109 const FAISenseID SenseID = UAISense::GetSenseID<FSenseClass>();
110 if (Senses.IsValidIndex(SenseID) && Senses[SenseID] != nullptr)
111 {
112 ((FSenseClass*)Senses[SenseID])->RegisterEventsBatch(Events);
113 }
114 }
115 // otherwise there's no one interested in this event, skip it.
116 }
117
118 template<typename FEventClass, typename FSenseClass = typename FEventClass::FSenseClass>
119 static void OnEvent(UWorld* World, const FEventClass& Event)
120 {
122 if (PerceptionSys != NULL)
123 {
124 PerceptionSys->OnEvent<FEventClass, FSenseClass>(Event);
125 }
126 }
127
128 UFUNCTION(BlueprintCallable, Category = "AI|Perception")
129 AIMODULE_API void ReportEvent(UAISenseEvent* PerceptionEvent);
130
131 UFUNCTION(BlueprintCallable, Category = "AI|Perception", meta = (WorldContext="WorldContextObject"))
132 static AIMODULE_API void ReportPerceptionEvent(UObject* WorldContextObject, UAISenseEvent* PerceptionEvent);
133
135 template<typename FSenseClass>
136 void RegisterSource(AActor& SourceActor);
137
139 AIMODULE_API void RegisterSource(AActor& SourceActor);
140
141 AIMODULE_API void RegisterSourceForSenseClass(TSubclassOf<UAISense> Sense, AActor& Target);
142
147 AIMODULE_API void UnregisterSource(AActor& SourceActor, const TSubclassOf<UAISense> Sense = {});
148
149 AIMODULE_API void OnListenerForgetsActor(const UAIPerceptionComponent& Listener, AActor& ActorToForget);
150 AIMODULE_API void OnListenerForgetsAll(const UAIPerceptionComponent& Listener);
151 AIMODULE_API void OnListenerConfigUpdated(FAISenseID SenseID, const UAIPerceptionComponent& Listener);
152
153 AIMODULE_API void RegisterDelayedStimulus(FPerceptionListenerID ListenerId, float Delay, AActor* Instigator, const FAIStimulus& Stimulus);
154
155 static AIMODULE_API UAIPerceptionSystem* GetCurrent(UObject* WorldContextObject);
156 static AIMODULE_API UAIPerceptionSystem* GetCurrent(UWorld& World);
157
158 static AIMODULE_API void MakeNoiseImpl(AActor* NoiseMaker, float Loudness, APawn* NoiseInstigator, const FVector& NoiseLocation, float MaxRange, FName Tag);
159
160 UFUNCTION(BlueprintCallable, Category = "AI|Perception", meta = (WorldContext="WorldContextObject"))
161 static AIMODULE_API bool RegisterPerceptionStimuliSource(UObject* WorldContextObject, TSubclassOf<UAISense> Sense, AActor* Target);
162
164
165 UFUNCTION(BlueprintCallable, Category = "AI|Perception", meta = (WorldContext="WorldContextObject"))
166 static AIMODULE_API TSubclassOf<UAISense> GetSenseClassForStimulus(UObject* WorldContextObject, const FAIStimulus& Stimulus);
167
168#if WITH_GAMEPLAY_DEBUGGER_MENU
170#endif // WITH_GAMEPLAY_DEBUGGER_MENU
171
172protected:
173
174 UFUNCTION()
175 AIMODULE_API void OnPerceptionStimuliSourceEndPlay(AActor* Actor, EEndPlayReason::Type EndPlayReason);
176
178 AIMODULE_API void RegisterSource(FAISenseID SenseID, AActor& SourceActor);
179
182 AIMODULE_API virtual void RegisterAllPawnsAsSourcesForSense(FAISenseID SenseID);
183
191 AIMODULE_API bool DeliverDelayedStimuli(EDelayedStimulusSorting Sorting);
192 AIMODULE_API void OnNewListener(const FPerceptionListener& NewListener);
193 AIMODULE_API void OnListenerUpdate(const FPerceptionListener& UpdatedListener);
194 AIMODULE_API void OnListenerRemoved(const FPerceptionListener& UpdatedListener);
195 AIMODULE_API void PerformSourceRegistration();
196
199 AIMODULE_API bool AgeStimuli(const float Amount);
200
201 friend class UAISense;
202 inline AIPerception::FListenerMap& GetListenersMap() { return ListenerContainer; }
203
204 friend class UAISystem;
205 AIMODULE_API virtual void OnNewPawn(APawn& Pawn);
206 AIMODULE_API virtual void StartPlay();
207
210private:
212 double CurrentTime;
213};
214
216template<typename FSenseClass>
218{
219 FAISenseID SenseID = UAISense::GetSenseID<FSenseClass>();
220 if (IsSenseInstantiated(SenseID) == false)
221 {
222 RegisterSenseClass(FSenseClass::StaticClass());
223 SenseID = UAISense::GetSenseID<FSenseClass>();
224 check(SenseID.IsValid());
225 }
226 RegisterSource(SenseID, SourceActor);
227}
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UFUNCTION(...)
Definition ObjectMacros.h:745
#define UCLASS(...)
Definition ObjectMacros.h:776
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Actor.h:257
Definition GameplayDebuggerCategory.h:49
Definition NameTypes.h:617
Definition UObjectGlobals.h:1292
static COREUOBJECT_API FObjectInitializer & Get()
Definition UObjectGlobals.cpp:5001
Definition Array.h:670
Definition SubclassOf.h:30
Definition AIPerceptionSystem.h:31
bool IsSenseInstantiated(const FAISenseID &SenseID) const
Definition AIPerceptionSystem.h:87
TArray< FPerceptionSourceRegistration > SourcesToRegister
Definition AIPerceptionSystem.h:83
void RegisterSource(AActor &SourceActor)
Definition AIPerceptionSystem.h:217
AIPerception::FListenerMap & GetListenersMap()
Definition AIPerceptionSystem.h:202
void OnEventsBatch(const TArray< FEventClass > &Events)
Definition AIPerceptionSystem.h:105
static void OnEvent(UWorld *World, const FEventClass &Event)
Definition AIPerceptionSystem.h:119
TArray< FDelayedStimulus > DelayedStimuli
Definition AIPerceptionSystem.h:67
AIMODULE_API FAISenseID RegisterSenseClass(TSubclassOf< UAISense > SenseClass)
Definition AIPerceptionSystem.cpp:52
AIPerception::FListenerMap ListenerContainer
Definition AIPerceptionSystem.h:44
void OnEvent(const FEventClass &Event)
Definition AIPerceptionSystem.h:94
EDelayedStimulusSorting
Definition AIPerceptionSystem.h:185
@ RequiresSorting
Definition AIPerceptionSystem.h:186
@ NoNeedToSort
Definition AIPerceptionSystem.h:187
double NextStimuliAgingTick
Definition AIPerceptionSystem.h:209
Definition AISenseEvent.h:14
Definition AISense.h:21
Definition AISubsystem.h:16
Definition AISystem.h:27
virtual AIMODULE_API void StartPlay() override
Definition AISystem.cpp:97
Definition Object.h:95
Definition World.h:918
Definition EngineTypes.h:3429
bool IsValid() const
Definition AITypes.h:210
Definition AIPerceptionTypes.h:130
Definition AIPerceptionTypes.h:247
Definition AIPerceptionTypes.h:300
Definition ObjectPtr.h:488
Definition LightweightStats.h:416
Definition WeakObjectPtrTemplates.h:25
Definition AIPerceptionSystem.h:60
double DeliveryTimestamp
Definition AIPerceptionSystem.h:61
FAIStimulus Stimulus
Definition AIPerceptionSystem.h:64
FPerceptionListenerID ListenerId
Definition AIPerceptionSystem.h:62
TWeakObjectPtr< AActor > Instigator
Definition AIPerceptionSystem.h:63
Definition AIPerceptionSystem.h:70
TWeakObjectPtr< AActor > Source
Definition AIPerceptionSystem.h:72
FPerceptionSourceRegistration(FAISenseID InSenseID, AActor *SourceActor)
Definition AIPerceptionSystem.h:74
bool operator==(const FPerceptionSourceRegistration &Other) const
Definition AIPerceptionSystem.h:78
FAISenseID SenseID
Definition AIPerceptionSystem.h:71