언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (26) - EQS를 이용한 엄폐 AI 3

ciel45 2024. 1. 2. 00:24

엄폐 EQS에 이어 공격을 담당하는 EQS도 빠르게 만들었다.

 

이름은 EQS_FindAttackPos로 짓고 내부는 다음과 같이 만들었다.

 

여기서 검사하는 것은 두가지이다.

  1. 아이템에서 플레이어 방향으로 라인트레이싱을 하여, 가로막히는 것들을 걸러낸다.
    • EQS_FindCover 때와는 반대이다. 플레이어로부터 가려지는 곳이 아닌, 플레이어를 노리기 위한 자리를 찾는 것이기 때문이다. 이를 위해서는 디테일 패널의 Bool Match를 꺼줘야 한다
  2. 자기자신에게서 최대한 가까운 포인트에 높은 점수를 준다.
    • 당연하게도 플레이어를 공격할 수 있는 위치로 빠르게 갈 수록 좋기 때문이다.

 

+ FindAttackPos EQS는 아이템들의 높이를 FindCover EQS보다도 더욱 높여주어야 한다. 적이 앉아서 엄폐해있다가 일어서서 사격을 할 것이므로, 아이템들이 플레이어로 라인트레이싱을 해볼 때 총구의 높이에서 수행해야 하기 때문이다.

여기서는 Post Projection Vertical Offset을 150으로 지정했다.

 

 

이렇게 엄폐, 공격을 담당하는 EQS가 모두 만들어졌으니, 비헤이비어 트리에서 이것을 사용해볼 시간이다.

 

 

그전에, 먼저 블랙보드에서 새로운 키 IsAttacking을 추가해주었다.

단어그대로 공격(사격) 중인지를 나타내는 플래그 키이다.

 

 

 

엄폐 & 공격을 담당하는 새로운 비헤이비어 트리 BT_FindCover를 만들고, 내부 노드를 다음과 같이 짜주었다.

EQS를 비헤이비어 트리에서 돌리는 것은 Run EQS Query 노드를 사용하면 된다.

노드를 선택한 뒤, 우측의 디테일 패널에서 EQS Request에 EQS 에셋을 넣는 칸이 있다. 거기에 지난 포스팅까지 만들어둔 EQS_FindCover를 넣어주면 된다.

 

Cover Sequence는 다음과 같이 동작한다.

  1. EQS_FindCover를 수행하여, 현재 위치에서 엄폐하기에 최적의 위치를 찾는다. 위치는 TargetLocation에 저장한다.
  2. TargetLocation으로 이동한다.
  3. BTTask_Cover를 수행한다. 태스크의 내부 구현은 뒤에 서술한다.
  4. 성공적으로 엄폐했다면 1초 대기한다.

Attack Sequence는 다음과 같이 동작한다.

  1. 0.5초 대기한다. (특별한 이유가 있는건 아니고, 공격하기 전 조금 여유가 있는 편이 자연스러워보여서이다.)
  2. EQS_FindAttackPos를 수행하여, 현재 위치에서 플레이어를 공격하기에 최적의 위치를 찾는다.
  3. 해당 위치로 이동한다. (TargetLocation)
  4. Rotate to face BB entry를 사용하여 플레이어 방향으로 회전한다. 키로 TargetActor를 사용하였는데, 앞서 Sight Sense Handling 함수에서 적이 플레이어를 보면 TargetActor로써 저장하도록 했기에 가능한 것이다.
  5.  BTTask_Attack을 수행한다. 태스크의 내부 구현은 뒤에 서술한다.

 

다만 Sight Sense Handling 함수를 수정할 필요가 있다. 원래 플레이어가 시야에서 사라지는 즉시 TargetActor를 지워버렸는데, 엄폐하고있는 동안은 플레이어가 시야에서 사라진다고 해서 TargetActor를 잊어버린다면 바보가 될것이다.

 

따라서 다음과 같이 수정해준다.

시각 자극을 성공적으로 느끼지 못하더라도, TargetActor를 지우지 않도록 한다. (Select Object 노드의 B에도 Player를 연결)

 

 

그리고 BTTask에서 사용할 블루프린트 인터페이스를 만들어, BP_Enemy에서 구현하도록 하였다.

Attack, Cover 두가지 함수를 담고있는 BPI_Combat 인터페이스
우측의 Implemented Interfaces에 BPI_Combat을 추가해주고, Cover와 Attack을 오버라이딩한다.

 

Cover 이벤트 실행시에는 Crouch를 수행, Attack 이벤트 실행시에는 Uncrouch 후 1초의 딜레이 뒤, Shoot 이벤트를 호출한다.

Shoot 이벤트는 다음과 같이 만들었다.

 

Crouch, Uncrouch 시에 적 캐릭터가 앉고 일어서는 애니메이션 작업은 포스팅에서는 생략하였다.

이미 인터넷 상에 수많은 튜토리얼이 있고, 간단한 작업이기 때문에 굳이 서술하지 않으려고 한다.

 

 

글이 길어지는걸 막기 위해서, BTTask의 내부 구현은 다음 포스팅에 이어서 쓰는게 나을 것 같다.