[UE5/기획] Enemy AI에 대한 기획

Jaeyoung Ko·2025년 2월 6일

0226 날짜 버전 readme에서 발췌.


2) Enemies

Rifle Trooper

  • most basic trooper
  • only ranged attack with his rifle
  • asset: paragon wraith

Assualt Trooper

  • armored trooper stronger than rifle trooper
  • melee attack

Grumpy Joe

  • unarmed target in mission 1
  • if noticing your approach, he runs away with screaming

Ivan, the Darkwater

  • boss character in mission 2

  • asset: paragon revenant

  • phase 1:

additional

Guard Turret

  • stationary turrect
  • guarding his own area


기획을 추가하면서 작성하는 이유는 현재 Trooper에 대한 AI를 위한 Behavior Tree와 관련한 코딩을 진행하기 위해서는 좀 더 세부적인 사항이 필요하기 때문이다.


'State' 가 필요하다.

trooper의 행동을 정의하기 위해서는 상태, 정확히는 State가 정의되어야 함이 필요하다.

State: Patrol, Trace, Hunt, Idle

  1. 순찰 중인 trooper는 플레이어를 발견하면, 플레이어를 추적하여 공격해야 한다. 이 때, 인접한 trooper들도 플레이어를 추적하여 공격해야 한다.

  2. 추적 중인 trooper가 플레이어를 놓칠 경우, 추적을 포기하고 복귀하여 원래의 순찰 행동을 지속해야 한다.

  3. Hunt 상태인 trooper는 플레이어의 위치를 완전히 안다는 가정하에, 현재 위치와 상관없이 추적하여 공격한다.

  4. idle한 상태인 trooper는 별다른 동작없이 대기한다. 그러나 시야 범위에 플레이어를 발견 시, 추적하여 공격한다. 마찬가지로 trace를 마칠 경우, 원래 위치로 복귀한다.




중요한 건 이러한 condition들에 대한 세부 정의가 필요하다는 것이다.

a. '순찰 중인 trooper'

순찰은 trooper 마다 자신의 순찰 path(간단히 path라고 했을 뿐 엄밀한 정의의 graph로는 walk)를 가지고 있어야 한다. 간단히 x, y 좌표 쌍의 리스트로 가져야 한다. 그리고, patrolPath에 대해 해당 좌표에 일정 랜덤한 시간 내에 머물고 있다가, 다음 좌표로 이동하는 방식으로 순찰한다.

ex. patrolPath: {(0, 0), (0, 500), (200, 500), (500, 800), (300, 1100), (200, 500), (0, 500), (0, 0)}
각 노드에서 8-12초 간 대기하고 있다가 다음 목표위치로 이동.

b. '순찰 중인 trooper는 플레이어를 발견'

trooper가 바라보는 정면으로 부채꼴 레이캐스팅을 통해 첫 번째로 hit되는 것 중에 플레이어가 존재해야 함.

c. '인접한 trooper들도 플레이어를 추적'

처음 발각이 일어난 위치 기준 특정 범위내의 존재하는 trooper에 대해 추적을 시행해야 한다.

d. '추적 중인 trooper가 플레이어를 놓칠 경우'

논란의 여지가 존재하는 상황은

trooper A가 플레이어를 발견하여, 인접 trooper B와 C도 추적을 시작할 때, B와 C의 플레이어 놓침 확인이 되면 다시 복귀해버리는 불상사가 발생하는 점이다.

이 점을 고려하여 추적을 같이할 인접 trooper의 범위trooper가 추적 시 플레이어 체킹이 서로 모순되지 않게 해야 한다.

또한 따돌리기 위해 이동속도는 플레이어가 기본적으로 trooper보다 빨라야 한다.

e. '추적을 포기하고 복귀하여 원래의 순찰 행동을 지속해야 한다.'

복귀하는 위치는 trooper가 마지막으로 순찰을 진행하던 상황의 목표위치 혹은 마지막 순찰 진행하던 때의 가장 마지막 방문한 노드 위치로 지정해야 한다. 왜냐하면 nearest로 가장 가까운 노드로 할 경우에는 path에 동일 위치가 존재할 경우 어느 위치를 지정해 줄 지 모호해진다.




생각보다 생각할 부분이 많은 부분인 것 같다.

추후에 더 추가하겠다.

profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글