Ludens
의 Unreal-Study 자료입니다.
- 우리는 Enemy 에 관련된 것은 모두 이 폴더에 넣을 것입니다.
- Speed(플로트) : 캐릭터의 속도를 담을 변수
Locomotion 을 더블 클릭하여 들어가줍시다. Idle 상태를 만들어줄겁니다.
좌측 하단의 콘텐츠 드로어를 클릭하여 'idle_relaxed' 를 검색하여 블루 프린트 내로 드래그해줍시다.
- jog_fwd 가 여러 개 있는니, 캐릭터를 잘 보고 선택해주세요~
- 상태가 변할 조건을 정해줄겁니다.
마찬가지로 간단합니다. Speed 가 0이 되면 Run 에서 Idle 로 바뀝니다.
끝입니다. 다시 AnimGraph 로 돌아와 Locomotion 과 최종 애니메이션 포즈를 이어주면 됩니다.
플레이어가 직접 컨트롤하는 PlayerBP 와 달리, EnemyBP 는 AIController 를 빙의시켜 주어야합니다.
- 꼭 이런 방식이 아니어도 되지만, 보편적인 방식입니다.
Enemy 폴더에서 블루 프린트 클래스를 생성해줍시다.
EnemyAIController 를 만들자마자 갑작스럽긴 하지만, EnemyBP 를 다시 열어봅시다.
그리고 좌측 상단의 컴포넌트에서 'EnemyBP(셀프)'를 클릭하고 우측의 디테일 탭의 '폰' - 'AI 컨트롤러 클래스' 를 EnemyAIController 로 바꿔줍시다.
- 바로 행동 트리(Behavior Tree)입니다.
조금 생소하실 수도 있겠습니다. Behavior Tree 란, 쉽게 설명하여 AI 가 어떤 행동을, 어떤 상황에 할 것인가를 담고 있는 Tree 입니다.
- 여기서 Tree 라는 자료 구조를 사용하기 때문에 Behavior 뒤에 Tree 가 붙습니다. 말 그대로 행동(Behavior)을 담은 Tree 입니다.
Enemy 폴더로 돌아와, AI 라는 이름의 폴더를 하나 만들어줍시다.
- 여기에 AI 에 관련된 것을 모두 넣을 것입니다.
- 이름은 EnemyBT 로 합시다.
Behavior Tree 와 뗄 수 없는 관계인 Black Board 입니다. BB 는 BT 에 사용될 여러 Key(= 사용자 지정 변수)값들을 담고 있습니다.
다시 AI 폴더로 돌아와, '인공지능' - '블랙보드' 를 생성해줍시다.
- 이름은 EnemyBB 로 합시다.
EnemyBT 를 선택해줍시다!
이제 EnemyAIController 에서 할 일은 끝났습니다. EnemyBT 를 열어봅시다.
- 현재는 BT 와 BB 가 각각 하나이기 때문에 자동으로 할당이 되었는데, 한 쌍이 아닐 때는 직접 알맞는 BB 를 할당해 주어야합니다.
이제 AI 폴더로 가서 EnemyBB 를 열 필요 없이, 우측 상단에 '블랙 보드'를 클릭하면 EnemyBB 가 열립니다.
본격적으로 행동 트리의 '행동' 부분 Logic 을 작성하기 전에, 다시 한 번 전체적인 구조를 정리하겠습니다.
- EnemyAIController 할당
- 별도의 컨트롤러가 없는 Enemy 를 컨트롤 해줄 AIController 생성 후 할당
- EnemyAIController 에서 Behavior Tree 실행
- BT 에 작성해둔 Logic 대로 행동
- 아직 작성하지 않았지만, 여기에 작성해둔 Logic 대로 행동합니다.
- 정리가 되지 않았다면, 몇 번 더 읽어보시길 권장합니다!
- 전부 다는 아니고, 우리의 AI 를 구현하는데 필요한 만큼만요. (사실 거의 전부긴 합니다..ㅎㅎ)
- 루트, 말그대로 뿌리같은 존재입니다. 시작점이라고 이해하시면 충분합니다.
- 여기서 자식 노드란, 부모 노드의 하위에 있는 노드를 뜻합니다.
위 그림에서 D, E 가 자식 노드입니다. 생소하신 분들은 자료 구조에서 배우시게 될겁니다!
Sequence 를 한 마디로 설명하면, '실패할 때까지 해라!' 입니다.
자식 노드를 왼쪽에서 오른쪽으로 실행하며, 실행 중인 자식 노드가 실패하면 그 다음 노드를 실행하고 성공하면 실행하지 않습니다.
마찬가지로, Selector 를 한 마디로 설명하면, '성공할 때까지 해라!' 입니다.
- 아직 감이 잡히시지 않으셔도 괜찮습니다. 이후 BT 의 Logic 을 작성하실 때 감이 오실겁니다!
Decorator 는 '조건문' 이라고 명확하게 표현할 수 있을 것 같습니다.
- 이를 통해 특정 조건을 만족하면 특정 행동을 하게끔 만들 수 있습니다.
우리가 사용할 것은 이 정도입니다! 이외에도 Simple Parallel, Service 등이 있지만 당장은 사용하지 않아도 됩니다.
- 궁금하시다면, [UE4] AI - 비헤이비어 트리(Behavior Tree) 를 참고하세요!
Behavior Tree Task 의 약자입니다. 위에서 설명한 Task 에 해당합니다.
- Function 과 기능이 유사하다고 하였습니다. 함수를 작성하는 느낌으로 만들어봅시다.
AI 폴더로 돌아와서, 블루 프린트 클래스를 생성해줍시다.
- 처음 만들 Task 이름은 MoveToPlayer 입니다.
눈치채셨을 수도 있지만, 이는 Player 에게 다가가기 위한 Task 입니다.
잘 실행되는지 확인해보기 위해 간단한 BT 를 작성해봅시다.
앞선 내용을 잘 이해하셨다면, BT 가 실행되면 Enemy 가 따라오다가 잠시 멈추고(Wait) 다시 따라오는 것을 반복할 것이라고 예측할 수 있습니다.
그런데 플레이를 해보면, 움직이지 않습니다. 왜일까요?
- 참고로 P 를 누르면 네비게이션 메시가 잘 설치되었는지를 확인할 수 있습니다. 아래 그림의 초록색 부분이 AI 가 걸어다닐 수 있는 공간입니다.
그런데 Enemy 가 너무 시도 때도 없이 따라옵니다. 따라서 일정 거리 내에 들어왔을 때에만 따라오도록 하고 싶습니다.
- Decorator 가 쓰이겠구나~ 라고 생각하셨다면 베리 굳입니다~
우선은 Enemy 와 Player 사이의 거리를 측정하는 용도의 Task 를 만들겁니다.
- 이것이 바로 SetDistance 의 용도입니다.
앞서 했던 것처럼, AI 폴더로 돌아와서, 블루 프린트 클래스를 생성해준 뒤, BTT 라고 검색하여 BTTask_BlueprintBase 를 선택해줍시다.
- Task 이름은 SetDistance 입니다. 생성한 뒤 바로 열어줍시다.
- Distance(블랙 보드 키 선택 툴) : 블랙 보드에 있는 키를 연결하기 위한 변수입니다. 키에 float 값을 전달합니다. (Enemy 와 Player 간의 Distance)
- 이걸 체크해야 블랙 보드에서 Key 와 연결하기 수월해집니다.
타입은 플로트, 이름은 Distance 라고 해줍시다.
BT 로 돌아와서 Distance Task 를 생성한 뒤, 이를 클릭하여 디테일 - 디폴트 - Distance 를 Distance 로 바꿔줍니다.
- SelfActor 로 설정되어 있을겁니다.
- 블랙보드 키 : Distance 로 설정
- 키 쿼리 : Is Less Than 으로 설정
- 키 값 : 500 으로 설정
- 다만 키 쿼리를 Is Greater Than or Equal To 로 설정해주어야합니다.
이렇게 완성된 BT 는, Enemy 와 Player 사이의 거리가 500 미만일 때에만 움직인다고 해석할 수 있습니다.
플레이 해봅시다!
조건에 따라 잘 작동하네요.
여기까지 2주차 Part.1 - AI Basic 이었습니다. 다음 포스팅은 2주차 Part.2 - AI Application 입니다~