-
[언리얼 블루프린트]간단한 몬스터 AI(Patrol)만들기Unreal Engine Blueprint/블루프린트를 이용한 게임 만들기 2019. 9. 2. 15:51
게임의 종류는 여러가지가 있다고 생각합니다. RPG, FPS, Simulation Game[시뮬레이션 게임] 등 여러가지의 게임이 있는데 거의 모든 게임에서 적(enemy)가 등장합니다. 그래서 오늘은 게임에서 중요하다고 생각하는 적 AI를 만들어 보겠습니다. 하지만 적 AI라고 말했지만 게임의 종류가 다르면 적의 AI도 다릅니다. 예를 들면 RPG에서 AI는 스킬도 쓸 수 있고 플레이어를 인지하는 방식이나 거리가 FPS에서 등장하는 적이 플레이어를 인지하는 방식이랑 거리가 다릅니다. 그래도 플레이어를 인지한다는 시스템등 비슷한 시스템은 존재합니다. 비슷하면 상황에 맞게 조금 바꿔서 사용할 수 있습니다.
기본적으로 쉽게 보며 생각 할 수 있는 적의 AI를 한번 보겠습니다.
월드 오브 워크래프트 "WOW" 의 인스턴트 던전의 모습 몬스터 헌터:월드에서 보여주는 지도와 일정한 구간을 돌아다니는 몬스터 제가 생각하는 기본적으로 볼 수 있는 적의 AI는 2가지가 있다고 생각합니다. 첫번째로는 "WOW" 사진에서 볼 수 있는 지정된 구역에서 벗어나지 않으며 돌아다니는 적 AI가 있다면 두번째로는 "몬스터 헌터:월드" 사진에서 볼 수 있는 일정한 구간을 계속 돌아다니는(Patrol)하는 적 AI 이렇게 2가지의 AI가 있다고 생각합니다. 이 글에서 설명하면서 만들어 보는 AI는 2번째인 Patrol를 하는 적 AI입니다.
먼저 언리얼 프로젝트를 블루프린트 프로젝트로 하나 생성해 주세요. (3인칭으로 만들면 기본적인 리소스를 사용할 수 있습니다.) 생성 한 뒤에 자신이 사용할 폴더를 하나 추가해 주세요. (게임 프로젝트는 파일 관리를 하면 매우 편리해집니다.)
자신이 사용할 폴더에서 블루프린트 클래스를 생성하고 난 뒤에 중앙에 보이는 모든 클래스를 클릭하여 검색창에서 AIController를 검색하고 생성해 주세요. (몬스터 aI에 사용될 컨트롤러입니다.) 그다음에 몬스터로 사용할 블루프린트를 만들기 위해 위 사진에서 보이는 Character 블루프린트를 하나 더 만들어 주세요.
캐릭터 블루프린트를 열면 위 사진처럼 보일 텐데 빨간색 부분인 Mesh를 누르고 오른쪽 Skeleta Mesh에서 마네킹을 선택해 주면 캐릭터의 모습이 보입니다. 여기서 xyz의 방향을 가리키는 빨 파초의 화살표가 아닌 하늘색 화살표는 실제 이 게임 오브젝트의 앞 방향을 가리킵니다. 그렇기 때문에 마네킹을 회전을 시켜서 앞 방향을 바라보게 만들어 주세요. 그리고 위 사진에 캡슐 모양의 선이 보이는데 저 선은 이 게임 오브젝트가 가지고 있는 콜리전입니다. 즉 이 게임 오브젝트는 저 캡슐 반경의 물리를 가지고 있습니다.
뷰포트 창에서 빨간색 부분을 누르면 여러 방향에서 볼 수 있습니다. 여러 방향에서 보면서 캐릭터의 위치를 캡슐 반경 안에 들게 만들어 줍니다.
캡슐 안에 들어가게 만들고 캐릭터 모델링이 앞 방향을 향하게 만들면 위 사진처럼 됩니다. 그다음에 Animation 속성에서 3인칭 기본 애니메이션을 선택해주면 이제 정상적으로 애니메이션이 적용되는 모습을 볼 수 있습니다.
이제 몬스터의 외관을 담당하는 모델 준비가 끝났습니다. 다음은 Patrol로 이동하는 블루프린트를 짜 보겠습니다.
먼저 이벤트 그래프 창을 들어가서 우클릭을 누르면 탐색 창이 뜨는데 이 창에서 검색해 블루프린트 노드를 생성할 수 있습니다.
Custom Event는 함수랑 같습니다. 검색할 내용은 Custom Event로 c++이나 c#등 프로그래밍에서 함수와 같은 역할을 합니다. Custom Event 노드를 만들어 노드의 이름을 PatrolPoint라고 만들어 주세요. (PartolPoint라는 함수를 만들었습니다와 같은 의미입니다.)
그다음에 BeginPlay 이벤트 노드에서 화살표를 드래그 해 아까 만들었던 PatrolPoint를 검색해서 연결해 줍니다.
이 블루프린트의 의미는 먼저 BeiginPlay 노드는 게임이 시작되었을 때 이 게임 오브젝트가 맨 처음 한 번만 실행되는 노드입니다. 한마디로 게임이 시작되면 한 번만 BeginPlay에 연결된 PatrolPoint라는 함수를 실행한다는 의미입니다.
이제 실제 Patrol에 사용할 변수를 만들어야 하는데 먼저 Patrol의 개수 변수인 PatrolNumber 변수를 만들어 줍니다.
변수 생성과 변수 타입 지정하는 방법 위 사진을 보고 int형 변수를 만들었다면 그다음은 실제 Patrol인 TargetPoiont 오브젝트 형 변수를 생성해 줍니다.
아까처럼 변수 만들고 탐색 창에서 target point 오브젝트 타입을 찾고 만들어 주고 빨간색 부분을 클릭해 배열 타입으로 만들어 줍니다. 그리고 인스턴스 편집 가능 부분을 클릭해 주면 외부에서도 이제 이 변수를 사용할 수 있게 해 줍니다.
이 작업을 통해 이제 실제 타깃 포인트를 관리하는 배열 변수와 몇 번째 타깃 포인트인지 확인하는 int형 변수를 생성해 준 것입니다. 이제 함수의 내용을 짜 보겠습니다.
일단 기본적인 몬스터 AI 내용은
*Patrol로 이동한다 -> target 배열의 길이와 patrolnumber의 숫자가 같나? -> yes or no
*yes -> target의 배열과 patrolnumber의 숫자가 같으면 순찰을 다 돌았기 때문에 다시 맨 처음부터 돌게 만든다.
*no -> 아직 안 끝났으니 다음 patrol인 target 포인트를 향하게 한다.
기본적인 설명들은 마우스를 가져가면 언리얼 내부에서 설명이 잘 써져있습니다. ai move to와 같은 블루프린트 노드들은 언리얼 사이트에서 자세한 설명이 써져있습니다. 위 사진의 내용은 "PatrolPoint 함수가 실행이 되면 이 게임 오브젝트 자기 자신을 Target 변수 배열에 Patrolnumber의 숫자에 있는 targetpoint 오브젝트를 가져와서 그 오브젝트로 이동하라"라는 간단한 내용입니다. 이 내용으로 인해 이동하는 문제는 해결이 되었습니다. 하지만 그다음 조건인 배열의 마지막 숫자와 같냐를 만들어 줘야 합니다. 그러기 위해선 if문을 써야 하는데 블루프린트에서 if문과 같은 역할을 하는 branch를 사용하면 됩니다.
위 사진의 내용은 if문인 branch의 true/false 조건 target 배열의 길이를 가져와서 -1 한 값이 patrolnumber의 값 보다 같거나 크면 0으로 초기화 시켜주고 그렇지 않으면 patrolnumber의 값을 +1 증가시킵니다. 그다음에 다시 patrolpoint라는 함수를 실행시키는 내용입니다. 이 함수의 내용은 위에 설명한 거와 같이 함수 실행이 되면 이동하고 조건에 따라 변수가 바뀌며 다시 함수를 실행합니다.
이제 실제 target 포인트를 맵에 배치하기 위해 왼쪽 위에 있는 모드 창에서 target 포인트를 검색해 맵에 배치 한 뒤에 만들었던 ai 몬스터 블루프린트를 맵에 배치하고 오른쪽 속성창을 보면 인스턴스 편집 가능을 체크해서 만들었던 변수를 볼 수 있습니다. 이 변수를 빨간색 +부분을 체크해서 배열을 배치한 타깃 포인트만큼 늘려주면 이제 target배열에 이동할 포인트들의 값이 들어갔습니다. 이제 게임을 시작하면 실제로 움직이는데 그전에 가장 중요한 네비 매시를 깔아 둬야 합니다.
타깃 포인트를 배치한 것처럼 내비 메시 바운드 볼륨을 맵에 배치하고 사이즈를 늘려서 이동이 가능하게 맵을 덮어두면 좋습니다. 이때 p키를 누르면 사진과 같이 초록색 덮인 부분이 보이는데 이 부분이 내비 매시가 적용이 되어있다는 걸 눈으로 쉽게 확인이 가능합니다. 그리고 이 부분은 ai move to함수를 통해 이동이 가능한 부분을 뜻합니다. 쉽게 말하면 초록색 부분이면 ai move to 함수로 어디든 이동이 가능하다 라는 뜻입니다.
이제 게임을 시작하면 Ai가 배치한 타깃 포인트를 계속 돌아다니는 몬스터의 AI(Patrol)를 볼 수 있습니다.
이렇게 기본적이며 간단한 몬스터의 ai를 쉽게 구현을 할 수 있습니다. 여기서 추가적인 조건(ex : 이동하는 동안 플레이어를 발견하면 플레이어를 쫓아가는 ai)이나 설정을 다듬어서 좀 더 나은 몬스터의 ai를 구현 할 수 있습니다.
-----------------------------------------------------------------------------------------------------------------------------------
-추가 설정
사진과 같이 게임 오브젝트 자신을 클릭해서 pawn 설정에서 yaw 컨트롤러 사용을 해지하고 ai controller class에서 맨 처음에 만들어준 aicontroller를 사용하게 합니다.
그 다음으로 캐릭터 무브먼트를 클릭해서 캐릭터 무브먼트 설정에서 두 개의 설정을 체크해 주면 이제 ai가 회전 할 때 자연스럽게 회전이 됩니다.
'Unreal Engine Blueprint > 블루프린트를 이용한 게임 만들기' 카테고리의 다른 글
[언리얼 블루프린트] SuperHot (0) 2019.11.18 [언리얼 블루프린트]레벨 블루프린트의 사용 방법 (0) 2019.11.04 [언리얼 블루프린트]포스트 프로세스 사용하기 (1) 2019.09.23 [언리얼 블루프린트]Slow Time 만들기 (0) 2019.09.16 [언리얼 블루프린트]누구나 할 수 있는 게임 만들기 (0) 2019.09.09