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의 거리 유지)