跳到主内容
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; //有攻击目标就要执行攻击行为,不能再移动
}

返回顶部