13-5. AI - (5) 비헤이비어 트리 데코레이터, 피격 반응, 원거리/근거리 몬스터의 이동
1. 데코레이터
특정 노드가 실행될지에 대한 여부를 결정한다.
노드에 붙일 수 있다.
Blackboard 데코레이터를 붙여서 TargetToFollow가 설정되어 있을 때만 하위 노드를 실행하게 설정한다.
9. 비헤이비어 트리 노드 생성하기
0. 개요 비헤이비어 트리에서 각 노드의 연결을 통해 AI의 작동 양식을 설정할 수 있다. 노드는 크게 시퀀스 노드와 태스크 노드로 구분된다. (1) 시퀀스 노드 - 시퀀스 노드는 여러 노드를 왼쪽에
crat.tistory.com
자세한 내용은 이전 포스트를 참조한다.
2. 피격 반응
(1) 피격 반응
몬스터가 피격 시 bHitReact를 변경하며 애님 몽타주를 재생하고 있다.
해당 변수를 블랙보드로 가져올 것이다.
void AAuraEnemy::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
// 클라이언트는 복제로 제공받음
if (!HasAuthority())
return;
AuraAIController = Cast<AAuraAIController>(NewController);
// 블랙보드 초기화
AuraAIController->GetBlackboardComponent()->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
// 비헤이비어 트리 작동
AuraAIController->RunBehaviorTree(BehaviorTree);
// 블랙보드 키 기본값 설정
AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), false);
}
블랙보드에서 키를 찾아 기본값을 false로 설정한다.
void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
// 태그가 있을 때만 작동
bHitReacting = NewCount > 0;
GetCharacterMovement()->MaxWalkSpeed = bHitReacting ? 0.f : BaseWalkSpeed;
// 블랙보드 키 설정
AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), bHitReacting);
}
HitReact Tag를 받을 때마다 bHitReacting 불리언을 변경하고 있다.
이를 블랙보드 키에 반영한다.
(2) 비헤이비어 트리 수정
하단의 셀렉터에 블랙보드 데코레이터를 하나 더 추가한다.
HitReacting 키의 값 변화를 추적하며 false일 때 중단한다.
3. 타겟에게 사거리까지 이동하기
몬스터의 타입에 따라서 적절한 AI를 도입할 것이다.
void AAuraEnemy::PossessedBy(AController* NewController)
{
Super::PossessedBy(NewController);
// 클라이언트는 복제로 제공받음
if (!HasAuthority())
return;
AuraAIController = Cast<AAuraAIController>(NewController);
// 블랙보드 초기화
AuraAIController->GetBlackboardComponent()->InitializeBlackboard(*BehaviorTree->BlackboardAsset);
// 비헤이비어 트리 작동
AuraAIController->RunBehaviorTree(BehaviorTree);
// 블랙보드 키 기본값 설정
AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), false);
// 근거리, 원거리 판정
AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("RangedAttacker"), CharacterClass != ECharacterClass::Warrior);
}
블랙보드에 새로운 키인 RangedAttacker 불리언을 생성한다.
캐릭터 클래스가 워리어가 아니면 true가 된다.
4. 비헤이비어 트리 구성
셀렉터는 자손이 실패하면 다음 자손을 실행한다.
이 비헤이비어트리는 아래와 같은 순서로 작동한다.
(1) RangedAttacker가 true이며 거리가 600 이하이면 원거리 시퀀스 작동
(2) RangedAttacker가 false이면 원거리 노드 실패 -> 근거리 노드 작동
(3) 타겟까지의 거리가 500보다 작으면 근거리 시퀀스 작동
(4) 타겟까지의 거리가 500보다 크면 근거리 노드 실패 -> 타겟에게 이동 노드 작동
(5) 타겟까지의 거리가 4000보다 작거나 같으며 500보다 크면 시퀀스 작동
(타겟으로부터 500의 거리 유지)