49. AI Move & Attack / Spline을 통한 정찰
Enemy의 대상 추격 / 공격 구현하기
저번 시간에는 AIPerception 컴포넌트를 통해서 인식된 대상을 BT_Enemy_Melee 비헤이비어 트리에서 받기까지 했다.
이번에는 인식한 대상을 추격하여 일정 거리 좁혀지면 공격하도록 해보았다.
제일 처음 Selector의 서비스(BTS_FindTarget)을 통해서 Target키에 값을 받아오고, 다음 데코레이터(Blackboard Based Condition)에서 Target키의 유효성을 검사한다.
Target키가 지정됬다면 Selector로 흘러가고, 아니라면 Wait 태스크로 계속 넘어간다.
다음으로 데코레이터(BTD_IsArmed)로 현재 Enemy의 장비 상태를 확인하는데, 데코레이터의 bCompareTo변수값과 CharacterInterface의 IsArmed를 비교하여 판단하였다.
따라서 데코레이터(BTD_IsArmed)가 True라면 Simple Parallel을 통해 BTT_Arm / BTT_LookAt 두 태스크를 동시에 실행시켜 Enemy가 Target을 바라보도록 하였다.
Enemy가 무기 장착 이후에는 데코레이터(BTD_IsArmed)의 값이 False가 나오며 더이상 해당 흐름으로 넘어가지 않는다.
장비 이후에는 Target으로 Enemy가 이동하도록 Move To 태스크로 이동시켜준다.
Move To 태스크의 Blackboard Key는 Target으로 꼭 지정하고, Acceptable Radius는 75.0로 설정해주었다.
이후, 공격을 위해 새 태스크 BTT_BeginActionA를 만든다.
BTT_BeginActionA 안에서는 CharacterInterface 함수 BeginActionA를 불러주기만 하면 된다.
이제 Sequence로 흐름이 넘어오면 MoveTo 태스크를 통해 Target을 향해 움직이고, 아까 지정한 Acceptable Radius 범위 안에 들어오면 Move To 태스크는 성공을 반환하고 BTT_BeginActionA 태스크로 흐름이 넘어가게 된다.
※ Attack 도중 피격당하면 더이상 Attack할 수 없던 문제
BP_Character에서 BeginActionA으로 공격을 시작할 때, AttackEnabled값은 false로 변하고 몽타주 재생이 다 끝나면 AttackEnabled를 다시 true로 변경하였다.
그런데 Attack 몽타주 재생이 끝나기 전에 Damage 몽타주가 재생되버리므로 AttackEnabled의 값이 더이상 변할 수 없게 되는 문제였다.
따라서 AnyDamage의 마지막 부분에 AttackEnabled와 AttackIndex의 값을 초기값으로 초기화 시켜주면 해결된다.
Enemy가 특정 거리를 정찰하기
Enemy가 지정한 특정 거리를 계속 왕복하며 정찰하도록 구현해볼 것이다.
새 블루프린트 - Actor를 선택하여 BP_PatrolRoute를 하나 생성한다.
여기서 Spline 컴포넌트를 추가해주고, Root 컴포넌트로 올려준다.
BP_PatrolRoute를 현재 레벨에 배치하면 위와 같은 흰색 점들이 보인다.
점 우클릭 - 스플라인 복제를 통해 점들의 위치를 Enemy가 움직일 수 있는 범위 내에 지정해준다.
* 점들을 위치 조정하다보면 곡선이 보일텐데, 실제로는 곡선으로 이동하지 못하고 최단 거리 직선으로 움직인다.
이번에는 새 블루프린트 - Actor Component를 통해 BP_PatrolComponent를 생성한다.
BP_PatrolComponent 내에서 PatrolRoute 변수를 추가하여 변수 유형을 BP_PartrolRoute로 지정하고 인스턴스 편집가능을 활성화 해준다.
이렇게 만든 BP_PatrolComponent는 BP_Enemy에서 해당 컴포넌트를 추가해주었다.
저장 및 디버그 후, 현재 레벨에 올라간 BP_EnemyMelee의 BP_PatrolComponent에서 Patrol Route를 BP_PatrolRoute로 설정해주었다.