본문 바로가기

게임프로그래밍/실습2

[실습2] 58. 행동 트리 데코레이터

1. 데코레이터

 

행동트리에서 데코레이터는 일종의 조건문 같은 것이라고 보면 된다. 이러한 데코레이터를 통해 에너미가 이동을 해야할지 아니면 공격을 해야할지 아니면 또 다른 행동을 해야할지 등을 지정할 수 있다.


2. 데코레이터 설정하기

 

이제 데코레이터를 설정해보자. 블랙보드 키를 통해 조건을 확인할 것이다.

 

디테일 패널에서 키를 선택하거나 다양한 작업들을 할 수 있다.

 

 

이제 블랙보드 키를 우리가 원하는 오브젝트로 바꾸자.

 

 

이렇게 하면 해당 키가 존재할때만 다음 노드가 실행된다.

 

이번에는 다른 설정을 하려고 한다. 에너미가 공격 받을 때 동작을 멈춰보려고 한다. 불리언 타입의 블랙보드 키를 추가하도록 하자.

 

 

이제 이 값을 초기화 해야하는데 이는 C++에서 진행할 것이다.


3. C++에서 블랙보드 키 초기화하기

 

AI컨트롤러와 행동트리가 설정되어있는 에너미 클래스로 들어갔다.

 

아래의 구문을 통해 블랙보드 키를 초기화 할 수 있다.

AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), false);

 

이제 이 변수를 히트시에는 true로 바꿔야 할 것이다.

 

void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
    bHitReacting = NewCount > 0;
    GetCharacterMovement()->MaxWalkSpeed = bHitReacting ? 0.f : BaseWalkSpeed;

// 이 아래로 추가
    if (HasAuthority())
    {
       AuraAIController->GetBlackboardComponent()->SetValueAsBool(FName("HitReacting"), bHitReacting);
    }
    
}

 

 

이제 에디터로 들어가 데코레이터를 추가해주자.

 

이제 히트시에는 다음 노드로 가지 않게 막을 수 있다.