실습
- 에디터 - 블랙보드 에셋
- 패트롤 포지션 벡터 key 추가
- 홈 포지션 벡터 key 추가
- 네비게이션 메쉬 볼륨 추가
- x, y, z 각각 10만, 10만, 1000
- 프로젝트 세팅 - Navigation Mesh - Runtime
- Runtime Generation을 Dynamic으로
- 행동 트리
- sequence
- wait
-> 대기 3초 (+- 1초)
- move to
-> 블랙보드 키를 패트롤 포지션으로
- BTTaskNode를 상속 받은 클래스 생성
- "NavigationSystem", "AIModule", "GameplayTasks" 모듈 추가해줘야 함
- 행동 트리를 실행하기 전 현재 위치를 홈 포지션으로 Set
- BTTaskNode의 ExecuteTask를 오버라이드
- BT 컴포넌트에서 pawn을 가져옴
- pawn에서 navi system을 가져옴
- GetRandomPointInNavigableRadius 함수를 통해 홈 포지션을 기준으로 반경으로 패트롤 포지션을 얻어옴
- 패트롤 위치 설정
- BTService 를 상속 받은 detect 클래스 생성
- service 노드는 TickNode라는 함수가 지정한 인터벌로 계속해서 실행
- 노드 이름과 인터벌 설정
- TickNode
루트
- 셀렉터
- 셀렉터 + 데코레이터(블랙보드)-> 키:타겟
- 시퀀스 + 데코레이터(블랙보드)-> 키:타겟, 아닐 때
+ On Value Change, abort:self
+ detect 서비스
- Attack 범위 데코레이터와 attack task 클래스 생성
루트
- 셀렉터
- 타겟 셀렉터
- 셀렉터 + 데코-> attack 범위
- attack task
- 셀렉터 + 데코-> attack 범위 inverse condition
+ abort: both
- move to
- attack 범위 데코레이터
- CalculateRawConditionValue 오버라이드
- 노드 이름 설정
- attack task
- interface를 통해서 공격 명령을 내림
- interface에 공격 명령 함수 추가
- 공격은 몽타주가 끝나야 공격이 끝났다라고 할 수 있음
- 명령을 내렸다고 해서 성공이라 할 수 없음
-> EBTNodeResult::InProgress 를 반환
- interface에 델리게이트 선언
-> 공격이 끝났는지 확인
- 공격이 끝나는 것을 파악하기 위한 함수에 몽타주가 있어서 사용하기 어려움
- 다른 함수 만들어줌(가상 함수)
- 공격이 끝날 때 호출하도록 함
- NPC에서 오버라이드해서 델리게이트 호출
- attack task
- attack 명령을 호출하기 전에 델리게이트 바인딩
- FinishLatentTask를 통해 마무리됐다고 알려줌
- target 셀렉터에도 detect를 붙여주면 플레이어가 죽었을 때 target이 null이 되서 공격을 멈춤
- 공격할 때 플레이어 바라보게 설정할 task node 추가
- selector 를 simple parallel로 변경