언리얼 엔진 시작하기 5

2016. 12. 30. 14:51기술/언리얼 스터디

반응형

전체적으로 엔진에 대해 살펴 보았으니 이번엔 게임 개발에 중요한 NavMesh와 AI에 대해서 알아 보겠습니다.

언리얼 홈페이지에서 NavMesh로 검색하여 보았습니다. NavMesh란 3D 맵 상에서 캐릭터가 이동 가능한 지역을 의미 합니다. 검색된 문서를 살펴보니 AI와 함께 설명되어 있습니다. 네, 제가 찾던 기술 문서 입니다. 제가 구현하고자 하는 것은 맵과 광선의 충돌 지점으로 캐릭터를 옮기는 기능 입니다. 그리고 NPC가 특정 지역을 돌아다니는 기능 구현을 원합니다.


학습 자료 > 엔진 기능 > 비헤이비어 트리에 가면 문서를 한글로 볼 수 있습니다.


아! 몰랐는데 이미 맵을 클릭하면 캐릭터가 돌아다닐 수 있는 예제 프로젝트가 바로 생성이 됩니다. 유니티에는 이런게 없죠.


연두색 지점을 클릭하면 아마 마우스에서 지형으로 광선을 쏘고 캐릭터가 그쪽으로 이동하라라는 코드가 있을 겁니다.

일단은 문서 내용데로 진행해 보도록 하겠습니다.


 - 문서데로 진행해서 적이 따라다니기는 합니다. -

적은 Idle -> Run 상태기계 변환도 안 해 줬는데 잘 달립니다.

벽 오브젝트들 Collision 속성을 Invisible로 주면 클릭이 되지 않아서 이동하기 편리합니다.


하지만 백지에서 시작하려면 뭔가 더 알아야 합니다.

1. 플레이어를 따라다니는 적 캐릭터가 이동경로를 알기 위해 네비 메쉬를 만듭니다.

2. 플레이어를 따라다니는 적 캐릭터 블루 프린트를 하나 만들어야 합니다.

   Character 클래스에서 상속을 받아서 AI_Character 블루 프린트를 만듭니다.

   만들어진 AI_Character 블루 프린트 > 클래스 디폴트에 보면 Pawn의 AI Controller Class에 설정 해 주어야 하는

3. Follower_AI_CON 블루 프린트를 하나 만듭니다. 만들 때, 부모 클래스가 AIController 입니다.

4. 인공지능(AI)를 만들기 위해 비헤이비어 트리와 블랙보드를 만듭니다.


Follower_AI_CON 블루 프린트에서는 BeginPlay시 비헤이비어 트리를 실행해야 합니다.

함수 실행 순서는 Use Blackboard -> Set Value as Vector -> Run Behavior Tree 입니다.


Use Blackboard : AI를 사용하기 위해 Blackboard 컴포넌트를 만듭니다.


이쯤에서 블루 프린트에 대해 한 번 읽어보고 오겠습니다. 분량이 조금 있는데 통독으로 읽겠습니다.

언리얼 엔진 4 문서 > 블루프린트 비주얼 스크립팅


적 캐릭터(AI_Character)의 AI로 연결되어 있는 Follower_AI_CON 블루프린트입니다. (AIController에서 상속)


모호했거나 제가 궁금했던 것은 위의 1, 2, 3 입니다.


1. 하얀색으로 연결되어 있는 부분은 명확하게 함수 실행의 순서 (흐름)입니다.


2. 변수를 설정하는 부분입니다.


3. 데이터를 설정할 수 있는 드랍박스 입니다.


위 이벤트그래프를 말로 설명하자면 이렇습니다.

캐릭터를 따라다니는 적 캐릭터는 블랙보드를 사용하고(Use Blackboard) 비헤이비어 트리(Run Behavior Tree)를 실행 시켜야 한다. 비헤이비어를 실행하기 전에 블랙보드의 VectorValue값을 설정(Set Value as Vector)해 주어야 한다.

타겟은 Self->GetBlackboard(), 키이름은 HomeLocation, 벡터값은 GetControlledPawn()->GetActorLocation()이다.


실제 코드로 만들면 하나의 함수 정도 될 것입니다.

그냥 C++코드로 만들어서 작동시켜 보려고 하였으나 UseBlackboard의 매개변수를 설정하기가 어려웠습니다.


C++과 블루 프린트는 무엇이 다른가?

C++로는 게임의 근간이 되는 것들을 만들어야 할 것 같습니다. 블루 프린트는 이미 만들어진 C++ 클래스로 엔진에서 제공하는 기능들을 블루 프린트를 사용해서 게임 디자이너 처럼 만들면 될 것 같습니다.



예제 콘텐츠(Contents Example) 프로젝트에서 나무와 돌을 이주해 왔습니다. 이주할 때, 콘텐츠 폴더에 넣어야 제대로 이주가 됩니다. 그렇지 않으면 메터리얼등이 링크가 깨지는것을 확인하였습니다.


위와 같이 여러 오브젝트들 (환경 오브젝트, 집 오브젝트, NPC) 로 맵을 꾸미면 마을이 되고 숲이 되고 전쟁터를 만들 수 있습니다.


간단한 지형을 만들기 위해 랜드스케이프에 대해서 알아 보았습니다. 실무에서는 지형 만들고 맵 오브젝트 배치하는 디자이너가 있어야겠습니다. 우측은 길찾기 네비를 적용한 모습입니다. 그리고 캐릭터 두 명을 이 지형으로 옮겼는데 지형을 클릭하면 잘 돌아다닙니다. 모바일에서는 성능상 지형과 배경오브젝트 캐릭터의 모든 정점 갯수가 중요합니다.



앞에서 배운 기술들을 활용해 보겠습니다. 일단은 FBX 로드가 필요합니다. FBX 파일을 어디서 찾을까 고민을 많이 했습니다. 웹도 검색해보고.. 예전에 유니티찬은 불러들여지지가 않아서 유니티 에셋 스토어에서 다시 찾아보던중 괜찮은 녀석을 발견했습니다. 언리얼 마켓플레이스에서 제공하는 Mixamo 콘텐츠를 사용해도 되지만 저는 버전이 안 맞습니다.

 


fbx파일과 텍츠쳐 파일만 존재하는 상태에서 드래그 앤 드랍으로 Sapphiart_model.fbx 부터 로드하고 나머지 애니메이션을 스켈레톤 지정해서 로드했습니다. (언리얼 엔진 시작하기 4 참고)



이제 이녀석을 맵 상에 띄워보도록 하겠습니다. 페르소나 스켈레탈 메시 애니메이션

너무 난해하고 복잡합니다. 저는 필요한 기능을 우선적으로 구현해보도록 하겠습니다.

기존에 뛰어다니던 플레이어 캐릭터(TopDownCharacter)를 찾아서 Mesh->Skeleton Mesh를 교체해 주면 캐릭터가 맵상에 보입니다. 하지만 Idle 애니메이션이 적용되지 않습니다.


언리얼 엔진 시작하기 4에서 스테이트 머신 만들기 부분만 다시 살펴 봅니다.

우선은 애니메이션 > 애니메이션 블루 프린트를 만들어야 합니다. (부모 클래스는 AnimInstance, 해당 캐릭터 스켈레톤 선택)


스테이트 머신을 하나 추가하고 포즈에 연결시켜 줍니다.


Idle이라고 이름지어주고 더블 클릭해서 들어갑니다. 애셋 브라우저에서 해당 애니메이션을 드래그 앤 드랍 한 다음 연결 시켜 줍니다.


아, 이것저것 테스트 해보고 건드리다가 뭔가 잘못 되었는지 엔진이 계속 에러나서 이번 튜토리얼은 여기까지 하고 마무리 해야겠습니다. 다시 처음부터 하나씩 차근히 진행해야겠습니다. 저 기본 캐릭터의 애니메이션 블루프린트를 잘못연결해 주었는데 에러 메시지가 뜨질 않네요. 그리고 수정하려고 하면 엔진이 뻗습니다.


다시 만들어 준 다음, FBX 파일 로드하고 위 애니메이션 블루프린트 생성해주고 스테이트 만든 다음,

현재 돌아다니고 있는 TopDownCharacter를 더블클릭 한 후 Mesh에서 다음과 같이 설정해 주면 Idle 애니메이션이 적용 되는 것을 볼 수 있습니다.


그리고 이제 Walk 스테이트를 추가해 줍니다.


저기 하얀색 동그란 트랜지션 버튼을 더블클릭한 후 Bool 변수를 하나 만들어 줍니다. (아, 오늘은 토요일이니까 여기까지)


IsWalk는 마우스를 클릭 했을 때, 캐릭터가 그 위치로 이동하는 동안이 IsWalk입니다. 유니티에서는 C#코드만 분석하면 되었는데 언리얼엔진에서는 블루프린트를 분석해야 할 것 같습니다.

일단은 마우스를 클릭하는 순간?과 이동중인가? 이 두가지를 분석하고 찾아내야 합니다.

이 기능은 어디에 있는가? 생각을 해 보면 이 기능은 캐릭터를 컨트롤 하는 기능 입니다. 그러므로 TopDownController에 있을 것입니다. 블루 프린트에서는 다음과 같이 표현합니다. 그런데 저는 아직 익숙하지 않습니다.  그렇다면 어떻게 해야 할까... 방법을 생각하다가 "역시 프로그래머는 코드를 봐야해."라고 생각했습니다. 이 블루프린트를 코드로 어떻게 표현할까?는 아랫쪽 코드를 보시면 알 수 있습니다. 코드로 제어하는 방법을 터득하면서 블루프린트를 익히도록 하겠습니다.

( 프로젝트를 생성할 때, 블루 프린트 또는 C++로 선택할 수 있습니다. )



ProjectNameTopDownController.h


ProjectNameTopDownController.cpp



그림 그리는 것에 비유하자면 전체적인 큰 그림을 그려 보았고 이제 간단한 덩어리를 그렸습니다. 앞으로는 명암을 잡고 사물을 정밀묘사 해야겠습니다. 정밀 묘사 하는 방법은 기초에 충실한 것입니다. 가장 처음에 프로그래밍 퀵 스타트는 해 보았고 그 다음 부분 입니다. 위에 있는 클래스들을 알기 위해서 입니다.



기초가 중요하며 기초를 알아야 원하는 기능을 만들어낼 수 있을 것입니다. 블루 프린트 기초 부터 하나씩 알아 보겠습니다.


이번 과에서는 탑 다운 방식과 AI 개요, FBX 파일 읽기, 스테이트 머신에 대해서 알아 보았습니다.

아직 언리얼 엔진의 AI 구현에 대해 알고 있다고 말 할수 없습니다. 그냥 "아, 이런 기능이 있구나.." 정도 입니다.

기초적인 것부터 알아야 언리얼 엔진의 AI 구현을 할 수 있을 것입니다.





반응형

'기술 > 언리얼 스터디' 카테고리의 다른 글

언리얼 엔진 시작하기 7  (0) 2017.01.04
언리얼 엔진 시작하기 6  (0) 2017.01.02
언리얼 엔진 시작하기 4  (0) 2016.12.12
언리얼 엔진 시작하기 3  (0) 2016.12.03
언리얼 엔진 시작하기 2  (0) 2016.11.30