Enemy AI ( Behavior Tree )

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


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

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

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

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

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


- 루트 노드 (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 로 지정한다


- 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 내용이 없어도 따라와 짐



- 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이 잘 작동하는지 새로 운 루트를 만든다

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