관리 메뉴

기억을 위한 기록들

[UE4] Behavior Tree에 관하여(2)- Task / Decorator 본문

UnrealEngine/UE- BehaviorTree

[UE4] Behavior Tree에 관하여(2)- Task / Decorator

에드윈H 2022. 3. 27. 15:37

데코레이터는 객체지향설계에서 자주 언급되는 디자인 패턴 중 하나인 Decorator Design pattern과 같은 의미의 단어입니다. 즉 기존에 존재하는 class를 수정하지 않고 기능을 변경하기 위해 기존 class를 감싸서(wrap한다고 하죠) 이 목적을 달성하는 패턴입니다. 사용자는 기존 class의 변경없이 부가적인 기능을 덧붙일 수 있는 장점을 지닙니다(이때 인터페이스는 동일해야 합니다.).

 

BT에서 데코레이터가 하는 역할도 똑같습니다. 데코레이터는 오직 하나의 자식 노드(즉 Task)를 가지는데(즉 바로 아래의 자식노드를 감싸는 역할을 한다는 의미겠지요..), 이 노드의 행위에 데코레이터가 영향을 줍니다. 데코레이터는 정말 다양하게 쓰일 수 있는데 본 글에서는 대표적으로 쓸만한 간단한 데코레이터만 언급하도록 하겠습니다.

 

가장 단순하게 자주 사용되는 녀석은 소위 필터(filter)라고 불리는 것으로 자식이 수행을 할지 말지를 결정하는 데코레이터가 있습니다. 예를 들어 자식노드가 반복적으로 수행되는 횟수를 제한하는 용도로 쓰일 수 있겠지요. 로직을 의사코드로 표현해 본다면 다음과 같습니다.

 

 

 

데코레이터는 Behavior Tree에서 노드 흐름의 조건들을 좀더 명확하게 꾸며주는 역할로

BT에서 해당 버튼을 눌러 데코레이터를 생성할수 있다.

 

그렇게 만든 블루프린트안에서  함수 오버라이드를 통해 필요한 함수들을 추가하고

 

최종적으로는 보통 Perform Condition CheckAI 혹은 Perform Condition Check함수를 오버라이드 하여 결과를 반환한다.

 

 

 

플레이어가 살아있다면 BTT_Attack를 수행하고 5초를 기다리겠지만, 플레이어가 죽어있따면 BTT_Attack에서 수행하지 않는다.

 

정리해보자면 어떻게 보면 데코레이터 문이 진정한  if문이라고 생각이 들기도한다.

Condition Check 결과에 따라 true냐 false를 만들어주며 다른 노드들에 영향을 주게 된다.

 

 

출처 : https://blog.naver.com/devdeepblue/220047782767