46. 데코레이터 / RInterp To
Tip!
Blender에서 Import / Export를 통해서 확장자 .fbx로 변환이 가능하다.
(상용 게임에서 에셋 추출하고 싶다면 Blender를 사용해볼 것!)
앞 배운 내용들
* 태스크 : 동작 / 작업
* 서비스 : 블랙보드의 확인과 업데이트 용도로 사용
데코레이터
데코레이터는 비헤이비어 트리에 분기를 나누기 위한 용도로 사용할 수 있다.
추가 방법 : 태스크 우클릭 - 데코레이터 선택을 통해서 해당 태스크에 사용할 데코레이터 추가
- Cooldown
Cool Down Time을 설정하면 해당 태스크가 지정한 값의 쿨타임을 가지게 된다.
쿨다운 타이머가 만료되었는지에 성공하거나 실패하는 데코레이터 노드이다.
첫 태스크 수행 후, Cool Down Time만큼 잠겨서 다시 수행하고자 하면 실패를 반환한다.
Cool Down Time이 지나면 다시 태스크 수행 가능.
* 데코레이터는 서비스와 태스크보다 우선순위가 높으니 사용에 주의할 것
- Force Success
결과에 상관없이 강제 성공 처리
시퀀스 내에 옵셔널 분기를 생성할 때 유용하다.
- TimeLimit
시간제한 데코레이터
작업 수행 시, 지정 시간 초과하면 실패 처리
타이머는 노드가 플로우 받아 활성화될 때마다 리셋된다.
- Blackboard(Based Condition)
블랙보드의 키값을 기반으로 하는 조건
Key Qury에 Is Set / Is Not Set을 통해서 Blackboard Key에 대해
조건을 걸어 검사한다.
해당 조건과 맞지 않다면 실패를 반환한다.
* 루트 바로 아래있는 Composite(Sequence 등등)에 붙는 데코레이트는 수행되지 않는다(-1)
Enemy AI 비헤이비어 트리 구현
심화된 Enemy AI를 만들기 위해서 새 비헤이비어 트리 BT_Enemy_Melee와 새 블랙보드 BB_Enemy_Melee를 생성했다.
BT_Enemy_Melee 비헤이비어 트리 Blackboard Asset을 BB_Enemy_Melee 블랙보드로 지정해줬다.
BB_Enemy_Melee 블랙보드에서 플레이어의 정보를 담을 Target(Object)라는 새 키를 생성했다.
Target 키의 디테일에서 KeyType 세부정보 Base Class를 Character로 지정해줬다.
BP_Enemy의 클래스 디테일과 변수 BehaviorTree의 값을 BT_Enemy_Melee로 바꿔주는 것도 잊지말자.
BT_Enemy_Melee 비헤이비어 트리
Root를 Composites들 중 Selector에 연결해준다.
Selector 밑으로 Sequence와 Wait를 연결하고, Sequence에 Blackboard 데코레이터를 추가해주었다.
- Wait 태스크는 0.5초로 설정해두었다. Selector의 우측에 두어서 실행 우선순위를 조절해준다.
- Blackboard 데코레이터는 블랙보드의 Target을 Key로 설정하여 Is Set(Target에 값이 Set되어있을 때)일 때만 성공한다.
* Target이 Set되어있다면 Sequence쪽으로, 아니라면 Wait 쪽으로 분기가 갈릴 것이다.
BTT_Arm
Sequence 이후로 이어지는 부분은 Enemy가 Target을 발견 시 무기를 장착하기위한 태스크를 연결해줄 것이다.
따라서 BlueprintBase 새 태스크 BTT_Arm을 만들어주었다.
BTT_Arm 태스크가 수행되면 해당 Enemy의 WeaponA를 호출하여 무기를 장착하는 방식이다.
BTD_IsArmed
이후 WeaponA를 계속 호출하여 무기의 장착 / 해제가 계속 반복되는 문제가 발생한다.
따라서 BTT_Arm에 문제를 막아줄 새 데코레이터 BTD_IsArmed를 추가한다.
BTD_IsArmed 데코레이터 내부에서 CompareTo(Boolean)변수를 추가해주고 인스턴스 편집 가능을 켜줬다.
오버라이드 함수 Perform Condition Check AI를 통해서 현재 Enemy의 IsArmed 상태와 CompareTo의 값의 And 결과를
반환해주는 것이다.
이후 BTT_Arm 태스크에 BTD_IsArmed 데코레이터를 추가해줬다.
* BTD_IsArmed 데코레이터의 CompareTo 변수가 False일 때 무기를 꺼내서 장착할 수 있다.
Enemy가 Target을 찾을 시 Target을 바라보도록 만들기 위해서 Rotate to Face BBEntry라는 태스크를 사용할 순 있지만,
너무 빠르게 돌아보는 부자연스러운 어색함이 있어서 직접 태스크를 만들어줄 것이다.
BlueprintBase의 새 태스크를 만들어주고, 해당 태스크 내부에서 Target(BlackboardKeySelector)변수를 하나 생성하였다.
Receive Execute AI 이벤트를 추가하고, Target 변수에서 Get Blackboard Value as Actor로 나오는 값을 변수로 승격하여
Set ActorToFace(승격한 변수)에 넣어준다.
이어서 연속적으로 부드럽게 회전하기위해 Receive Tick AI 이벤트를 추가하고, 함수로 변환해주었다.
Get Controlled Pawn에서 GetActorLocation을 뽑아와 Find Look at Rotation의 Start에 연결해주고,
Get Actor to Face 변수에서 GetActorLoaction을 뽑아와 Find Look at Rotation의 Target에 연결해준다.
RInterp To(보간)
Get Controlled Pawn에서 GetActorRotation을 뽑아와 RInterp To(보간)에 이어준다.
RInterp To는 현재 회전에 기반하여 타깃 회전에 도달하려고 시도하며, 타깃 회전으로 회전할 때 부드러운 느낌을 준다.
따라서 현재 회전 Current(GetActorRotation)에서 Target(Find Look at Rotation)으로 회전하게 될텐데 Delta Seconds마다
Interp Speed만큼 회전하게 될 것이다.
Interp Speed는 변수로 승격하여 15.0의 값을 지정해주었다.
그렇게 회전하게되는(RInterp To) 값을 Get Controlled Pawn의 SetActorRotation의 New Rotation에 연결하여 매 Tick마다
부드러운 회전이 가능하도록 구현하였다.
마지막으로 Finish Execute를 통해 SetActorRotation의 Return Value값을 그대로 반환해주었다.