0. 개요
비헤이비어 트리 컴포넌트와 블랙보드 컴포넌트를 가지는 AI 컨트롤러를 생성한다.
1. AIController 생성
(1) Aura.Build.cs에 AI 모듈 추가하기
using UnrealBuildTool;
public class Aura : ModuleRules
{
public Aura(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayAbilities", "UMG" });
PrivateDependencyModuleNames.AddRange(new string[] { "GameplayTags", "GameplayTasks", "NavigationSystem", "Niagara", "AIModule" });
AI 관련 기능을 사용하기 위해 AI모듈을 추가한다.
(2) AuraAIController
AIController를 상속받는 커스텀 AI 컨트롤러를 생성한다.
#pragma once
#include "CoreMinimal.h"
#include "AIController.h"
#include "AuraAIController.generated.h"
class UBlackboardComponent;
class UBehaviorTreeComponent;
/**
*
*/
UCLASS()
class AURA_API AAuraAIController : public AAIController
{
GENERATED_BODY()
public:
AAuraAIController();
protected:
UPROPERTY()
TObjectPtr<UBehaviorTreeComponent> BehaviorTreeComponent;
};
비헤이비어 트리 컴포넌트를 생성한다.
블랙보드 컴포넌트는 부모 클래스인 AI Controller에 Blackboard로 존재한다.
#include "AI/AuraAIController.h"
#include "BehaviorTree/BehaviorTreeComponent.h"
#include "BehaviorTree/BlackboardComponent.h"
AAuraAIController::AAuraAIController()
{
Blackboard = CreateDefaultSubobject<UBlackboardComponent>("BlackboardComponent");
check(Blackboard);
BehaviorTreeComponent = CreateDefaultSubobject<UBehaviorTreeComponent>("BehaviorTreeComponent");
check(BehaviorTreeComponent);
}
(3) AuraEnemy에 비헤이비어 트리와 AI 컨트롤러 추가
UPROPERTY(EditAnywhere, category="AI")
TObjectPtr<UBehaviorTree> BehaviorTree;
UPROPERTY()
TObjectPtr<AAuraAIController> AuraAIController;
};
(4) PossessedBy 함수 오버라이드
UCLASS()
class AURA_API AAuraEnemy : public AAuraCharacterBase, public IEnemyInterface
{
GENERATED_BODY()
public:
AAuraEnemy();
virtual void PossessedBy(AController* NewController) override;
void AAuraEnemy::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
AuraAIController = Cast<AAuraAIController>(NewController);
}
이 함수는 액터가 컨트롤러를 갖게 되는 순간에 호출되는 함수이다.
컨트롤러를 캐스팅하여 AuraAIController 멤버 변수에 저장한다.
(5) Aura AI Controller 블루프린트 생성
Aura AI Controller 클래스를 상속받는 블루프린트를 생성한다.
이후 BP_EnemyBase에서 기본 AI 컨트롤러 클래스를 방금 생성한 블루프린트로 지정한다.
2. 비헤이비어 트리와 블랙보드
(1) 비헤이비어 트리와 블랙보드 생성
컨텐츠 서랍 우클릭 - 인공지능 - 블랙보드, 비헤이비어 트리를 클릭하여 생성한다.
(2) BP_EnemyBase에 비헤이비어 트리 설정
이전에 AuraEnemy에서 생성했던 멤버 변수에 비헤이비어 트리를 지정한다.
3. 비헤이비어 트리 실행
비헤이비어 트리와 블랙보드를 구성하기 전에 C++ 코드에서 비헤이비어 트리를 작동하도록 할 것이다.
(1) AuraEnemy의 PossessedBy 함수에서 RunBehaviorTree 함수 호출하기
void AAuraEnemy::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
// 클라이언트는 복제로 제공받음
if (!HasAuthority())
return;
AuraAIController = Cast<AAuraAIController>(NewController);
// 블랙보드 초기화
AuraAIController->GetBlackboardComponent()->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
// 비헤이비어 트리 작동
AuraAIController->RunBehaviorTree(BehaviorTree);
}
- AI는 서버에서 작동하고 클라이언트로 복제한다.
- 비헤이비어 트리를 작동하기 전에 블랙보드를 초기화해야 한다.
GetBlackboardComponent는 빈 블랙보드 컴포넌트인 Blackboard 멤버 변수를 반환한다.
이 컴포넌트를 비헤이비어 트리 내의 블랙보드로 초기화한다.
(2) 테스트
애니메이션을 재생하도록 트리를 구성하여 적절하게 재생되는지 확인한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
13-4. AI - (4) 부드럽게 돌리기, 몬스터에 이펙트 액터(물약 등) 적용 여부 (0) | 2024.12.27 |
---|---|
13-3. AI - (3) 비헤이비어 트리 서비스 블루프린트 생성 - 가까운 플레이어 찾기 (0) | 2024.12.27 |
13-1. AI - (1) 몬스터 AI 설정 계획 (0) | 2024.12.27 |
12-10. 멀티플레이어 디버깅 (0) | 2024.12.27 |
12-9. 데미지 타입 - (3) 속성 저항 데미지 계산 (0) | 2024.12.26 |