Documentation
1.装饰器.md
2025/12/16预计阅读 2 分钟
创建一个装饰器
需要继承UBTDecorator,这个很简单,只要实现CalculateRawConditionValue方法即可。
示例
需要,创建一个 task 装饰器,来判定怪物是否需要执行移动的任务,如果黑板里面有攻击的陷阱目标,则不执行移动任务,而是执行攻击任务。
创建类继承UBTDecorator
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "BehaviorTree/BTDecorator.h"
#include "BTDEnemyUseMoveTaskDecorator.generated.h"
/**
* 怪物是否使用移动任务的装饰器
*/
UCLASS()
class DEMO2_API UBTDEnemyUseMoveTaskDecorator : public UBTDecorator
{
GENERATED_BODY()
public:
virtual bool CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory) const override;
};
代码实现
// Fill out your copyright notice in the Description page of Project Settings.
#include "AI/Decorator/BTDEnemyUseMoveTaskDecorator.h"
#include "BehaviorTree/BlackboardComponent.h"
bool UBTDEnemyUseMoveTaskDecorator::CalculateRawConditionValue(UBehaviorTreeComponent& OwnerComp,
uint8* NodeMemory) const
{
const auto BlackboardComp = OwnerComp.GetBlackboardComponent();
if (BlackboardComp == nullptr) return false;
//获取黑板里面的攻击陷阱目标
auto TrapTarget = BlackboardComp->GetValueAsObject(TEXT("TrapTarget"));
if (TrapTarget == nullptr) return true;
return false; //有攻击目标就要执行攻击行为,不能再移动
}