언리얼엔진

49. AI Move & Attack / Spline을 통한 정찰

찬이2 2023. 7. 19. 01:03

Enemy의 대상 추격 / 공격 구현하기

저번 시간에는 AIPerception 컴포넌트를 통해서 인식된 대상을 BT_Enemy_Melee 비헤이비어 트리에서 받기까지 했다.

이번에는 인식한 대상을 추격하여 일정 거리 좁혀지면 공격하도록 해보았다.

 

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를 불러주기만 하면 된다.

BTT_BeginActionA 태스크

 

이제 Sequence로 흐름이 넘어오면 MoveTo 태스크를 통해 Target을 향해 움직이고, 아까 지정한 Acceptable Radius 범위 안에 들어오면 Move To 태스크는 성공을 반환하고 BTT_BeginActionA 태스크로 흐름이 넘어가게 된다.


※ Attack 도중 피격당하면 더이상 Attack할 수 없던 문제

BP_Character의 AnyDamage 마지막 부분 추가(AttackEnabled, Attack Index)

BP_Character에서 BeginActionA으로 공격을 시작할 때, AttackEnabled값은 false로 변하고 몽타주 재생이 다 끝나면 AttackEnabled를 다시 true로 변경하였다.

그런데 Attack 몽타주 재생이 끝나기 전에 Damage 몽타주가 재생되버리므로 AttackEnabled의 값이 더이상 변할 수 없게 되는 문제였다.

따라서 AnyDamage의 마지막 부분에 AttackEnabled와 AttackIndex의 값을 초기값으로 초기화 시켜주면 해결된다.


Enemy가 특정 거리를 정찰하기

Enemy가 지정한 특정 거리를 계속 왕복하며 정찰하도록 구현해볼 것이다.

새 블루프린트 - Actor를 선택하여 BP_PatrolRoute를 하나 생성한다.

 

BP_PatrolRoute의 컴포넌트

여기서 Spline 컴포넌트를 추가해주고, Root 컴포넌트로 올려준다.

 

BP_PatrolRoute 스플라인 포인트 지정

BP_PatrolRoute를 현재 레벨에 배치하면 위와 같은 흰색 점들이 보인다.

점 우클릭 - 스플라인 복제를 통해 점들의 위치를 Enemy가 움직일 수 있는 범위 내에 지정해준다.

* 점들을 위치 조정하다보면 곡선이 보일텐데, 실제로는 곡선으로 이동하지 못하고 최단 거리 직선으로 움직인다.


이번에는 새 블루프린트 - Actor Component를 통해 BP_PatrolComponent를 생성한다.

BP_PatrolComponent 내에서 PatrolRoute 변수를 추가하여 변수 유형을 BP_PartrolRoute로 지정하고 인스턴스 편집가능을 활성화 해준다.

BP_PatrolComponent의 PatrolRoute 변수 설정

 

이렇게 만든 BP_PatrolComponent는 BP_Enemy에서 해당 컴포넌트를 추가해주었다.

저장 및 디버그 후, 현재 레벨에 올라간 BP_EnemyMelee의 BP_PatrolComponent에서 Patrol Route를 BP_PatrolRoute로 설정해주었다.