게임을 플레이할 맵을 만들어준다. 랜드스케이프 모드를 이용해 지형을 다듬고 경계를 만들고,  에셋을 사용해 땅의 색깔을 바꾸어 주었고, 폴리지를 이용해 에셋에 있는 돌, 나무 등을 추가하였다.

 

랜드스케이프 모드

스컬프팅은 지형을 높이는 도구, 플래튼은 지형의 높이를 평평하게 맞추는 도구이다. 이 둘을 중점으로 맵 틀을 만들었다.

 

폴리지 모드

아래에서 원하는 폴리지를 선택하고 페인트하거나 지울 수 있다.

이 두 툴을 이용해 게임을 진행할 동선을 구상하였다. 

 

완성된 맵의 모습

그 후 전에 만들었던 ai에 새로운 스켈레탈 매시 에셋을 설정해주고, 카메라 컴포넌트를 더 늘렸다. (시야를 넓히기 위함인데 잘 동작하는지는 의문이다. 평소보다 인지 범위가 늘어난 것 같은 느낌을 주긴 했다.)

 

 

또한 앰비언트 사운드를 추가하였는데, 앰비언트 사운드를 추가하고 옵션에서 어테뉴에이션 설정을 활성화하면 거리에 따라 소리의 크기가 달라지게 된다. 오버라이드를 켜면 상세설정을 직접 할 수 있는데, 볼륨과 공간화를 설정해주어야 한다.

 

어테뉴에이션 = 감쇠

본인은 어테뉴에이션 함수를 선형으로, 모양은 구 형태로, 또 내부 반경은 1200, 감쇠 거리는 5113으로 설정해주었다. 이를 뷰포트에서 보면 아래와 같아진다.

 

내부 반경 안에서는 소리 감쇠가 없고, 외부 반경까지 범위에서는 소리가 들린다. 

또한 공간화 설정을 키면 소리가 방향성을 가져 3D처럼 소리 컴포넌트가 있는 곳에서 들리게 된다.

 

 

사운드의 경우 mp3 파일은 호환되지 않고, 이를 wav로 변환해 임포트해야한다. 

앰비언트 사운드에 사운드를 넣을 때 처음에는 그냥 wav 파일만 넣었는데, 외부 반경 밖으로 나갔다가 다시 들어오니 소리가 재생되지 않는 문제가 있었다. 그래서 사운드 큐를 제작해 wav 파일을 연결해 주었고, 사운드 큐의 설정에서 사운드 루핑을 체크한 뒤 앰비언트 사운드에 넣어주니 문제가 해결되었다.

 

루핑을 체크하면 반복재생을 해주어 범위 밖으로 나갔다 들어와도 사운드 재생이 가능하다.

 

게임을 처음 설계할 때 아이템을 20개 먹으면 포탈이 열리는 식으로 설계했었다. 우선 먹으면 사라지는 아이템을 구현해 주었다.

 

단순한 큐브에 BOX Collision을 추가하였고, 다른 컴포넌트가 오버랩되었을 때 이벤트가 발생하도록 설정하였다.

 

오버랩 시작시 플레이어 캐릭터에 형변환을 진행하고, 이 액터를 삭제하도록 했다.

 

플레이어 블루프린트에도 상응한 블루프린트가 필요하다.

 

cube에 형변환을 해 주어야 한다.

캐릭터에 미리 만들어둔 Box Collision과 큐브가 닿으면 Total 이라는 변수 값에 1을 더하고, 이 과정을 반복한 뒤에 그 값이 20 이상이 되었을 때 성공 지점으로 향하는 포탈을 스폰하는 이벤트를 제작하였다. 스폰 위치는 미리 정해주었다. 

처음 스폰액터 노드를 보면 위 사진처럼 위치를 찍어주는 것이 없는데, spawn transform을 우클릭하여 구조체 핀 분할을 해 주면 원하는 위치와 회전, 크기를 찍을 수 있다.

 

이 포탈은 위의 캐릭터와 오버랩을 시작하면 플레이어 액터를 삭제하고, 성공 맵으로 캐릭터를 다시 스폰한 뒤 컨트롤러를 부여하여 다시 조작할 수 있도록 하였다.

 

20개 이상을 먹고 포탈로 들어가면 아래 맵의 한 지점으로 이동하게 된다.

 

 

다음으로 플레이에서 불편함을 줄이기 위해 위젯을 생성해 현재 가진 큐브의 갯수를 알 수 있도록 하였다. 

 

텍스트와 이미지를 추가해 주었다.

위의 ###텍스트와 현재 가진 큐브 갯수를 연동해주어야 한다. 텍스트의 디테일에서 콘텐츠 란의 텍스트 입력 칸이 있는데, 오른쪽의 바인딩을 클릭하여 새로운 함수를 생성해주었다.  

 

구성은 위와 같은데, 함수에 플레이어를 형변환하고, 아까 플레이어 블루프린트 이벤트그래프에서 Total이라는 변수를 불러와 그 값을 텍스트로 변환한 뒤 반환해주었다. 이렇게 하면 현재 보유한 큐브 갯수가 위젯에 표시된다.

현재 게임모드베이스 블루프린트에서 beginplay 이벤트에 방금 만들어준 위젯을 뷰포트에 추가해주면 게임을 할때 항상 위젯이 표시되게 된다.

 

 

또 플레이어가 AI에게 잡혔을 때 죽었다는 메시지와 함께 버튼을 누르면 게임을 재시작하도록 구성하고자 했다. 그래서 위젯을 하나 더 만들었고, 플레이어와 AI가 겹치면 실행되는 이벤트를 만들었다.

 

문자와 함께 버튼을 추가했다.

위젯 버튼의 경우 아까 텍스트와 마찬가지로 디테일 탭에서 클릭 시 발생하는 이벤트를 만들어주었다.

 

버튼을 누르면 현재 데스 화면을 삭제하고, 게임모드를 재실행하게 설정했다. 

Restart Game 노드의 타깃을 연결할 때 기존의 게임모드 베이스를 연결하려고 했더니 불가능하다는 메시지가 나왔다. Restart Game의 타깃은 게임모드 자체인데, 기존에 내가 사용하던 게임 모드 베이스는 게임모드 블루프린트가 아닌 게임모드 베이스 블루프린트였다. 그래서 게임모드 블루프린트를 하나 더 생성하고, 아까 전 위젯 실행 노드를 다시 넣어주었더니 연결할 수 있었다.

 

추가로 특정 지역에 들어가면 AI 를 스폰하여 갑툭튀를 하도록 하는 이벤트를 만들어주었다.

 

위 사진처럼 트리거 박스를 만들어 플레이어가 오버랩하였을 때 이 액터를 삭제하고 AI를 특정 위치에 스폰하도록 하는 1회성 이벤트를 구현해주었다. 

 

오버랩이 시작되면 플레이어 액터에 형변환을 하고, 이 액터를 삭제한 뒤 AI를 스폰하고 AI의 수명을 정해주었다. 수명은 초 단위로 Set Life Span에서 정할 수 있고, 상황에 따라 다르게 설정해주었다.

 

 

이를 통해 AI를 스폰하였을 때 AI가 나를 추격하지 않는 문제가 발생하였는데, 어려움을 느끼던 도중 AI컨트롤러가 제대로 불러오기가 안되었겠다는 생각을 하였고, 결국 AI 블루프린트에 beginplay 이벤트를 추가하고 AI의 디폴트 컨트롤러를 불러오는 노드를 추가하여 해결하였다.

 

앞서 만들어놓은 트리거를 통해 특정 장소에 방문하였을 때 이벤트를 여러개 더 추가해 주었고, 완전히 어두운 상황에서 길을 안내할 라이트 컴포넌트를 맵의 동선에 따라 추가하여 게임을 완성하였다. 

 

일지 1에 이어, 이번에는 플레이어를 쫓아오는 인공지능을 구현하였다.

콘텐츠에 ai라는 이름의 폴더를 추가하고, 인공지능 역할을 할 캐릭터 매시와 인공지능의 컨트롤러를 배치하였다.

 

AICHARACTER은 앞서 1에서 만든 플레이어블 캐릭터를 그대로 복사하여 이름만 바꿔준 것인데, 복사해준 뒤 캐릭터 블루프린트를 열어 구현했던 이벤트 그래프를 모두 삭제하였다.

그리고 폰 항목에서 앞서 생성했던 AICON 을 사용하게 만들어주면 된다.

 

AI가 맵에서 돌아다니게 하려면 NavMesh를 설정해주어야 한다.

맵에 배치하여 크게 만들어주면 그 영역 내에서 AI가 움직일 수 있다.

 

다음은 블랙보드와 비헤이비어 트리이다.

 

블랙보드는 아래 사진처럼 3가지 키를 만들어주면 된다.

EnemyActor은 베이스 클래스를 ACTOR로 지정해야한다.
벡터
부울

다음은 비헤이비어 트리인데, 처음 비헤이비어 트리를 생성하면 우측의 블랙보드 에셋을 방금 만들었던 블랙보드로 설정해주어야 한다.

 

다음은 루트라는 노드를 클릭해 끌어서 다른 노드를 생성해주어야 한다.

위의 숫자는 순서를 나타내는데, , 왼쪽에서 오른쪽으로 순서가 이루어져 위치 또한 중요합니다.

 

인공지능이 플레이어를 쫓아오게 만들고, 플레이어가 시야에 없을 때는 순찰하도록 나누었다.

태스크는 이후에 구현한다.

인공지능이 플레이어쪽으로 얼굴을 돌리게 하는  Rotate to face BB entry와 플레이어를 추격하게 하는 태스크, 플레이어에게 이동하도록 하는  Move To 를 추가하였다.  (태스크 추가는 상단의 새 태스크에서 하면 됨.)

순찰의 경우도 마찬가지이다.

BTT_ChasePlayer라는 태스크를 구현해준다.

Chase Speed라는 플로트 변수를 추가하였다. 인스턴트 편집 기능을 활성화하면 비헤이비어 트리에서도 속도 수정이 가능하다.

다음은 BTT_FindRandomPatrol이다.

Patrol Speed와 Patrol Radius는 내가 원하는 값을 넣고 변수로 승격시켜주었다.

 

그다음으로 AI를 컨트롤할 AICON을 구현해준다. 이것이 없으면 AI는 동작하지 않는다.

왼쪽의 컴포넌트에서 추가를 눌러 AI 인지 컴포넌트를 추가해주어야 한다. Run Behavior Tree에서 BT Asset는 아까 만든 비헤이비어 트리를 넣어주면 된다. Actor Has Tag는 'Player' 값을 입력하면 된다. Set Timer by Event에서 Time은 4.0으로 설정해주고 변수로 승격하였다.

 

마지막으로 플레이어블 캐릭터(디폴트 폰)의 블루프린트를 열고, Player라는 태그를 추가하였다. 이렇게 하면 아까전 AICON에서 설정한 태그와 호환되어, AI가 플레이어를 쫓아오게 된다.

 

 

추격 속도를 조금 낮추고 맵 분위기를 어둡게 한 뒤 AI 매시에 라이트를 하나 추가하고 테스트를 해보았다.

비헤이비어 트리에서 Patrol Player을 삭제한 결과이다.

 

 

잘 작동한다.

우선은 움직일 수 있는 캐릭터를 만드는 것으로 시작함.

 

https://docs.unrealengine.com/5.0/ko/setting-up-character-movement/ 이 링크 참조

 

언리얼 마켓플레이스에서 제공되는 스타터 팩 스켈레톤 매시를 이용하여 캐릭터를 만듦.

 

프로젝트 설정의 입력 - 키 맵핑에서 필수적인 키들을 설정해주고, 만들어준 캐릭터의 스켈레톤매시에 스프링 암과 카메라 매시를 추가해준다. 

현재 만들고자 하는 공포게임은 1인칭 기반이므로, 카메라의 위치도 1인칭에 맞게 설정해 준다.

 

 

키 맵핑과 컴포넌트 추가가 끝났으면 캐릭터의 블루프린트로 들어간다. 이벤트 그래프에서 각 입력 축에 대한 이벤트를 설정해주면 끝이다.

 

캐릭터 무브먼트를 클릭하여 디테일을 수정하면 물리적 영향을 수정할 수 있다. 

애니메이션은 따로 추가하지 않았다. (1인칭 시점이라서 그렇게 만들었는데, 추후 시간이 남는다면 애니메이션도 추가할 예정이다.)

 

또한 게임모드 베이스 블루프린트를 생성하고 수정하여 내가 원하는 게임 설정으로 만들 수 있다. 

 

프로젝트 세팅에서 기본 게임 모드를 방금 만든 게임모드 베이스로, 디폴트 폰 클래스를 아까 만든 캐릭터로 설정해주면 언리얼 게임 실행시 만든 캐릭터로 실행이 가능하다.

 

 

 

 

+ Recent posts