UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
BTNode.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"
7#include "UObject/Object.h"
12#include "Tasks/AITask.h"
13#include <type_traits>
14#include "BTNode.generated.h"
15
16class AActor;
17class ISlateStyle;
18class UBehaviorTree;
19class UBlackboardData;
21class UGameplayTasksComponent;
22
24
25class AAIController;
26class UWorld;
27class UBehaviorTree;
30class UBlackboardData;
32
37
45
46UCLASS(Abstract, config=Game, MinimalAPI)
48{
50
51 AIMODULE_API virtual UWorld* GetWorld() const override;
52
55
57 AIMODULE_API virtual void InitializeFromAsset(UBehaviorTree& Asset);
58
60 AIMODULE_API virtual void InitializeMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryInit::Type InitType) const;
61
63 AIMODULE_API virtual void CleanupMemory(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const;
64
66 AIMODULE_API virtual void DescribeRuntimeValues(const UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTDescriptionVerbosity::Type Verbosity, TArray<FString>& Values) const;
67
69 AIMODULE_API virtual uint16 GetInstanceMemorySize() const;
70
72 AIMODULE_API virtual void OnInstanceCreated(UBehaviorTreeComponent& OwnerComp);
73
75 AIMODULE_API virtual void OnInstanceDestroyed(UBehaviorTreeComponent& OwnerComp);
76
78 AIMODULE_API void InitializeInSubtree(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, int32& NextInstancedIndex, EBTMemoryInit::Type InitType) const;
79
82
84 AIMODULE_API virtual uint16 GetSpecialMemorySize() const;
85
86#if USE_BEHAVIORTREE_DEBUGGER
89
91 UBTNode* GetNextNode() const;
92#endif
93
94 template<typename T>
95 T* InitializeNodeMemory(uint8* NodeMemory, EBTMemoryInit::Type InitType) const;
96
97 template <typename T>
98 void CleanupNodeMemory(uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const;
99
100 template<typename T>
101 T* GetNodeMemory(FBehaviorTreeSearchData& SearchData) const;
102
103 template<typename T>
104 const T* GetNodeMemory(const FBehaviorTreeSearchData& SearchData) const;
105
106 template<typename T>
107 T* GetNodeMemory(FBehaviorTreeInstance& BTInstance) const;
108
109 template<typename T>
110 const T* GetNodeMemory(const FBehaviorTreeInstance& BTInstance) const;
111
112 template<typename T>
113 T* CastInstanceNodeMemory(uint8* NodeMemory) const;
114
116 template<typename T>
117 T* GetSpecialNodeMemory(uint8* NodeMemory) const;
118
120 UBTCompositeNode* GetParentNode() const;
121
123 AIMODULE_API FString GetNodeName() const;
124
126 uint16 GetExecutionIndex() const;
127
129 uint16 GetMemoryOffset() const;
130
132 uint8 GetTreeDepth() const;
133
135 void MarkInjectedNode();
136
138 bool IsInjected() const;
139
141 void ForceInstancing(bool bEnable);
142
144 bool HasInstance() const;
145
147 bool IsInstanced() const;
148
150 UBehaviorTree* GetTreeAsset() const;
151
153 AIMODULE_API UBlackboardData* GetBlackboardAsset() const;
154
156 AIMODULE_API UBTNode* GetNodeInstance(const UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const;
157 AIMODULE_API UBTNode* GetNodeInstance(FBehaviorTreeSearchData& SearchData) const;
158
160 AIMODULE_API FString GetRuntimeDescription(const UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTDescriptionVerbosity::Type Verbosity) const;
161
163 AIMODULE_API virtual FString GetStaticDescription() const;
164
165#if WITH_EDITOR
167 AIMODULE_API virtual const ISlateStyle& GetNodeIconStyleSet() const;
168
170 AIMODULE_API virtual FName GetNodeIconName() const;
171
173 AIMODULE_API virtual bool UsesBlueprint() const;
174
176 AIMODULE_API virtual FString GetErrorMessage() const;
177
179 virtual void OnNodeCreated() {}
180
181 AIMODULE_API void PreSave(FObjectPreSaveContext SaveContext) override;
182
185#endif
186
188 virtual void SetOwner(AActor* ActorOwner) {}
189
190 // BEGIN IGameplayTaskOwnerInterface
191 AIMODULE_API virtual UGameplayTasksComponent* GetGameplayTasksComponent(const UGameplayTask& Task) const override;
192 AIMODULE_API virtual AActor* GetGameplayTaskOwner(const UGameplayTask* Task) const override;
193 AIMODULE_API virtual AActor* GetGameplayTaskAvatar(const UGameplayTask* Task) const override;
194 AIMODULE_API virtual uint8 GetGameplayTaskDefaultPriority() const override;
195 AIMODULE_API virtual void OnGameplayTaskInitialized(UGameplayTask& Task) override;
196 // END IGameplayTaskOwnerInterface
197
198 AIMODULE_API UBehaviorTreeComponent* GetBTComponentForTask(UGameplayTask& Task) const;
199
200 template <class T>
201 T* NewBTAITask(UBehaviorTreeComponent& BTComponent)
202 {
203 check(BTComponent.GetAIOwner());
204 bOwnsGameplayTasks = true;
205 return UAITask::NewAITask<T>(*BTComponent.GetAIOwner(), *this, TEXT("Behavior"));
206 }
207
208 template <class T>
209 T* NewBTAITask(const UClass& Class, UBehaviorTreeComponent& BTComponent)
210 {
211 check(BTComponent.GetAIOwner());
212 bOwnsGameplayTasks = true;
213 return UAITask::NewAITask<T>(Class, *BTComponent.GetAIOwner(), *this, TEXT("Behavior"));
214 }
215
217 UPROPERTY(Category=Description, EditAnywhere)
218 FString NodeName;
219
220private:
221
223 UPROPERTY()
225
227 UPROPERTY()
229
230#if USE_BEHAVIORTREE_DEBUGGER
233#endif
234
237 uint16 ExecutionIndex;
238
241 uint16 MemoryOffset;
242
245 uint8 TreeDepth;
246
249 uint8 bIsInstanced : 1;
250
253 uint8 bIsInjected : 1;
254
255protected:
256
259 uint8 bCreateNodeInstance : 1;
260
264 uint8 bOwnsGameplayTasks : 1;
265};
266
268// Inlines
269
270inline UBehaviorTree* UBTNode::GetTreeAsset() const
271{
272 return TreeAsset;
273}
274
275inline UBTCompositeNode* UBTNode::GetParentNode() const
276{
277 return ParentNode;
278}
279
280#if USE_BEHAVIORTREE_DEBUGGER
281inline UBTNode* UBTNode::GetNextNode() const
282{
283 return NextExecutionNode.Get();
284}
285#endif
286
287inline uint16 UBTNode::GetExecutionIndex() const
288{
289 return ExecutionIndex;
290}
291
292inline uint16 UBTNode::GetMemoryOffset() const
293{
294 return MemoryOffset;
295}
296
297inline uint8 UBTNode::GetTreeDepth() const
298{
299 return TreeDepth;
300}
301
302inline void UBTNode::MarkInjectedNode()
303{
304 bIsInjected = true;
305}
306
307inline bool UBTNode::IsInjected() const
308{
309 return bIsInjected;
310}
311
312inline void UBTNode::ForceInstancing(bool bEnable)
313{
314 // allow only in not initialized trees, side effect: root node always blocked
315 check(ParentNode == NULL);
316
317 bCreateNodeInstance = bEnable;
318}
319
320inline bool UBTNode::HasInstance() const
321{
322 return bCreateNodeInstance;
323}
324
325inline bool UBTNode::IsInstanced() const
326{
327 return bIsInstanced;
328}
329
330template<typename T>
331T* UBTNode::InitializeNodeMemory(uint8* NodeMemory, EBTMemoryInit::Type InitType) const
332{
333 if (InitType == EBTMemoryInit::Initialize)
334 {
335 new(NodeMemory) T();
336 }
338}
339
340template <typename T>
341void UBTNode::CleanupNodeMemory(uint8* NodeMemory, EBTMemoryClear::Type CleanupType) const
342{
343 if constexpr (!std::is_trivially_destructible_v<T>)
344 {
346 {
348 }
349 }
350}
351
352template<typename T>
353T* UBTNode::GetNodeMemory(FBehaviorTreeSearchData& SearchData) const
354{
356}
357
358template<typename T>
359const T* UBTNode::GetNodeMemory(const FBehaviorTreeSearchData& SearchData) const
360{
362}
363
364template<typename T>
365T* UBTNode::GetNodeMemory(FBehaviorTreeInstance& BTInstance) const
366{
367 return (T*)(BTInstance.GetInstanceMemory().GetData() + MemoryOffset);
368}
369
370template<typename T>
371const T* UBTNode::GetNodeMemory(const FBehaviorTreeInstance& BTInstance) const
372{
373 return (const T*)(BTInstance.GetInstanceMemory().GetData() + MemoryOffset);
374}
375
376template<typename T>
377T* UBTNode::CastInstanceNodeMemory(uint8* NodeMemory) const
378{
379 // using '<=' rather than '==' to allow child classes to extend parent's
380 // memory class as well (which would make GetInstanceMemorySize return
381 // a value equal or greater to sizeof(T)).
382 checkf(sizeof(T) <= GetInstanceMemorySize(), TEXT("Requesting type of %zu bytes but GetInstanceMemorySize returns %u. Make sure GetInstanceMemorySize is implemented properly in %s class hierarchy."), sizeof(T), GetInstanceMemorySize(), *GetFName().ToString());
383 return reinterpret_cast<T*>(NodeMemory);
384}
385
386template<typename T>
387T* UBTNode::GetSpecialNodeMemory(uint8* NodeMemory) const
388{
389 const int32 SpecialMemorySize = GetSpecialMemorySize();
390 return SpecialMemorySize ? (T*)(NodeMemory - ((SpecialMemorySize + 3) & ~3)) : nullptr;
391}
#define NULL
Definition oodle2base.h:134
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
DIRECTLINK_API Display
Definition DirectLinkLog.h:8
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_UCLASS_BODY(...)
Definition ObjectMacros.h:768
#define UCLASS(...)
Definition ObjectMacros.h:776
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
Definition AIController.h:91
Definition Actor.h:257
Definition NameTypes.h:617
Definition ObjectSaveContext.h:244
Definition GameplayTaskOwnerInterface.h:21
Definition ISlateStyle.h:18
Definition Array.h:670
Definition BTCompositeNode.h:88
Definition BTNode.h:48
uint8 bCreateNodeInstance
Definition BTNode.h:259
Definition BehaviorTreeComponent.h:105
uint16 GetActiveInstanceIdx() const
Definition BehaviorTreeComponent.h:590
TArray< FBehaviorTreeInstance > InstanceStack
Definition BehaviorTreeComponent.h:305
Definition BehaviorTree.h:16
Definition BlackboardData.h:46
Definition Class.h:3793
Definition GameplayTask.h:146
FORCEINLINE FName GetFName() const
Definition UObjectBase.h:233
Definition Object.h:95
Definition World.h:918
Type
Definition BehaviorTreeTypes.h:217
Type
Definition BehaviorTreeTypes.h:135
@ Destroy
Definition BehaviorTreeTypes.h:136
Type
Definition BehaviorTreeTypes.h:126
@ Initialize
Definition BehaviorTreeTypes.h:127
FString ToString(uint16 Value)
Definition PathFollowingComponent.cpp:82
Definition BTNode.h:34
int32 NodeIdx
Definition BTNode.h:35
Definition BehaviorTreeTypes.h:320
Definition BTNode.h:39
UBehaviorTreeComponent & OwnerComponent
Definition BTNode.h:41
FString RuntimeDescription
Definition BTNode.h:43
Definition BehaviorTreeTypes.h:534
UBehaviorTreeComponent & OwnerComp
Definition BehaviorTreeTypes.h:536
Definition ObjectPtr.h:488
Definition Optional.h:131
Definition WeakObjectPtrTemplates.h:25