[ Unreal Engine 5 / #14 Enemy AI, patrol, chase]

SeungWoo·2024년 9월 27일

[ Ureal Engine 5 / 수업 ]

목록 보기
15/31
post-thumbnail

Enemy AI ( Behavior Tree )

  • 간단한 Mesh 처리를 위해 Blueprint로 character를 하나 만든다

  • 이후 해당 블루프린트 Event Graph로 가서 Custom Event 하나를 만들고 "ChasePlayer"라고 이름 짓는다

  • 자연스러운 움직임을 추가하기 위해 약간의 딜레이를 넣는다

  • 월드로 넘어가서 Nav Mesh Bounds Volume를 하나 만들고 크기를 설정한다

  • 단축키 p 를 누르면 해당 영역이 표시되고 이 초록하게 표시된 부분을 이동 할 수 있게 된다

  • attack 이라는 또 이벤트를 만들고 블루프린트를 완성한다

  • 이제 본격적으로 Behavior Tree 를 사용하여 AI의 동작을 조직하고 관리하는 시스템을 만든다

  • 정리

    • Behavior Tree : 게임 AI의 동작을 조직하고 관리하는 시스템
    • Black Board : AI의 상태, 정보, 데이터를 저장하고 공유하는 중앙 데이터 저장소

  • 루트 노드 (Root Node) : 트리의 최상위 노드로, AI의 가장 중요한 결정 또는 시작점이 됩니다.
  • 부모 노드와 자식 노드 (Parent & Child Nodes) : AI는 부모 노드가 결정한 사항에 따라 자식 노드로 이동하면서 복잡한 행동을 수행합니다.
  • 탐색 속도 : 빠르게 행동 결정을 내리기 위한 트리 구조는 성능 최적화에도 중요한 요소입니다.
  • 트리 구조 ~~~ >> 탐색 >> (빠른 속도) 원하는 데이터 구하기
  • 큰 데이터를 빠르게 Read 에 적합

  • 왼쪽이 조금 더 작은 단위의 개념
  • Tasks : AI가 실행할 개별 행동들을 정의합니다. 각각의 태스크는 특정 행동이나 조건을 수행하며, Behavior Tree 내에서 실행됩니다. 예를 들어, "체크 건강 상태", "목표까지 거리 측정" 같은 기능들을 수행
  • Blackboard (Memory) : AI가 필요한 데이터를 저장하고, 다양한 태스크들이 공유할 수 있는 공용 데이터(Key)를 관리합니다. 플레이어 위치나 체력 등의 정보가 저장될 수 있습니다.
  • Behavior Tree (Brain) : AI의 의사결정 프로세스를 담당하며, 블랙보드 데이터를 이용해 태스크를 순차적으로 실행하거나 선택
  • Controller와 Pawn : Behavior Tree에서 결정된 행동이 Pawn (캐릭터)에 전달되어 실제로 움직이는 부분입니다. Controller는 AI와 캐릭터 간의 통신을 담당

  • 크게 세 종류로 구분 지을 수 있다

  • 자식 노드를 왼쪽에서 오른쪽으로 진행
  • 자식 노드 중에 성공 시, 중단 함
  • 모든 자식 노드가 실패면 실패

  • 자식 노드를 왼쪽에서 오른쪽으로 진행
  • 자식 노드 중에 실패 시, 중단 함
  • 모든 자식 노드가 성공이면 성공

  • 단일 기본 작업 노드를 전체 트리와 함께 실행
    • 기본 작업이 완료되면 마침 모드 의 설정 에 따라 노드가 즉시 완료되어 보조 트리가 중단되어야 하는지, 아니면 보조 트리가 완료될 때까지 지연되어야 하는지가 지정

  • Root (BB_Enemy_Base) : 트리의 시작점으로, Behavior Tree에서 적의 행동이 시작되는 지점입니다.
  • Sequence 노드 : 여러 행동을 순차적으로 실행합니다. 모든 하위 노드가 성공해야 상위 노드가 성공으로 간주됩니다.
  • Move To 노드 : AI가 특정 위치(여기서는 SelfActor)로 이동하는 행동을 정의합니다. 이 노드는 적이 목표 지점으로 이동하는 데 사용됩니다.

  • Behavior Tree : 게임 AI가 의사결정을 하는 구조로, 블랙보드에서 정보를 가져와 행동을 수행합니다.
  • Blackboard : Behavior Tree와 연결된 데이터 저장소입니다. AI의 행동에 필요한 다양한 정보를 저장하는데, 이 이미지에서는

  • AI가 알아야 하는 모든 요소는 블랙보드 키(Blackboard Key) 를 통해 참조

  • 블랙보드에 키를 추가하고, 이름을 TargetActor로 설정 후, Base class 를 Actor로 지정 한다
  • 나중에 TargetActor 라는 키 이름으로 블랙보드 키를 찾을 예정이다

  • Move To 노드를 누르고, Blackboard Key를 TargetActor 로 지정한다

  • Move To의 이름을 MoveToTarget으로 바꾸고 범위를 150정도로 올린다

  • AI 컨트롤러 [ AI - Controller ]
    AI 컨트롤러는 사람 플레이어의 입력 없이 주변 월드를 관찰하고 의사를 결정한 뒤 알맞게 반응합니다.

  • AIController 블루프린트를 AIC_Enemy_Base 라는 이름으로 만든다

  • AIC_Enemy_Base에서 Event On Posses를 선언한다
  • Event On Posses
    • AI 컨트롤러가 특정 AI 캐릭터를 제어하기 시작할 때 호출되는 이벤트
    • AI 컨트롤러가 AI 캐릭터를 "Possess(지배)"하거나 제어하려 할 때 해당 캐릭터를 설정하고 초기화하는 데 사용
    • 예를 들어, 게임에서 특정 상황에 AI 캐릭터를 생성하고, 해당 AI 캐릭터를 AI 컨트롤러가 제어해야 할 때 OnPossess 이벤트를 사용하여 AI 컨트롤러와 AI 캐릭터를 연결하고 초기 설정을 수행 가능

  • 기존 Event Graph 내용이 없어도 따라와 짐

  • Task를 하나 만든다

  • Abort AI : 중단 할 때 호출
  • Excute AI : 실행될 때 호출
  • Tick : 프레임마다 호출

  • DISPATCHERS를 하나 만든다 Call로 해당 DISPATCHERS를 불러 연결

Patrol

해당 지점을 정하고 그 지점을 계속해서 돌아다니는 방법으로 순찰을 하게끔 하겠다

  • BP_Patrol 이라는 이름의 Actor 블루프린트를 하나 만든다

  • Event Graph 으로 넘어가 Custom Event의 IncrementPatrol이라는 이름을 짓고 하나 만든다
  • PatrolIndex, PatrolDirection 이라는 Integer변수를 두개 만든다

  • Get Number Of Spline Points 가르키는 것은 끝점이다. 해당 Actor로 만든 Spline의 점 하나하나를 여기에 배열 형태로 담아 끝점인가 아닌가를 Check해 해당 끝점까지 갔다가 다시 반대로 비교해 해당 구간을 반복해서 왔다갔다 하게끔 하기 위한 로직이다


-Get SplinePointWorld라는 이름의 함수를 하나 만들고 블루프린트를 작성하자

  • Enemy 블루프린트로 어가 PatrolSpline이라는 블루프린트변수를 하나 만들고 뷰포트에 배치 한뒤 해당 PatrolSpline 과 매칭 시켜 준다

  • Task를 하나 더 만들고 BBT_MovePatrol 이라고 이름 짓는다

  • 현재 캐스팅으로 해당 이벤트를 발생 시키면 너무 비효율적이고 여러가지 패턴을 만들때 복잡해지므로 Interface를 사용해 캐스팅을 우회하고자 한다


  • 해당 Interface를 하나 만들고 Outputs에 PatrolSpline를 넣는다

  • Enemy블루프린트에 ClassSetings 를 누르고 Interface를 등록 한다

  • 중간에 까먹고 안들었는데 Task를 하나 만들고 사진 처럼 블루프린트를 작성한다

  • 나중에 연결하겠지만 일단 지금 ChasePlayer 를 끊고 Patrol이 잘 작동하는지 새로 운 루트를 만든다

  • 급브레이크 현상 수정 < 제동 거리 > 고정 제동 거리 ,경로를 위한

profile
This is my study archive

0개의 댓글