언리얼 호러게임 프로젝트 c++

250x250

언리얼 호러게임 프로젝트 C++

 

이 글에 나오는 호러게임은 언리얼을 공부하던 초반에 만든 프로젝트입니다.

그 당시 언리얼 엔진의 기능에 익숙하지 않았고, C++에 더 익숙해지기 위해 개발을 시작했습니다.

그래서 특별한 아이디어보다는 공포게임에서 흔히 볼 수 있는 요소들을 우선적으로 구현해보았습니다.

공포게임은 스토리와 레벨 디자인이 가장 중요하다고 생각합니다.

이 부분은 제가 자신이 없어서 프로젝트를 중단하게 되었습니다.

나중에 특별하게 추가할 수 있는 요소가 생각나면 나중에 다시 개발할 계획이지만, 이 프로젝트를 이어서 계발하기보다는 처음부터 다시 시작할 생각입니다.

게임에 대해.

개발 언어                   : C++

개발 엔진                   : Unreal 5.1 (현재는 5.4.4)

개발 환경(실행 환경) : 윈도우 11.

 

코드.

https://github.com/ykarr/HorrorGameTest

 

GitHub - ykarr/HorrorGameTest

Contribute to ykarr/HorrorGameTest development by creating an account on GitHub.

github.com

기능.

1. 아이템.

아이템 주변에 접근하면 화살표가 나타납니다.

아이템을 주울 수 있는 거리에 접근하면 "E" key UI가 나타납니다.

구현을 하기위해 아이템 Actor에 Begin Overlap, EndOverlap 함수를 만들어서 사용했습니다.

그러다보니 여러가지 불편한게 많아서 그냥 캐릭터에 Collision을 만들어서 처리하거나 다른 방법으로 구현하는게 많았나 하는 생각이 많이 드는 기능이었습니다.

(아이템 주변에 플레이어가 접근하면 아이템 위치를 알려주기 위해 Collision을 사용했는데 Collision이 너무 크고 많아서 레벨을 수정하거나 할 때 불편함.)

2. 인벤토리.

인벤토리에 아이템이 없을 때는 아이템 칸이 활성화되지 않습니다.

(마우스를 올려도 색이 변하거나 하지 않음.)

아이템이 존재하면 아이템 칸이 활성화되며, 아이템 위에 마우스를 올리면 Tooltip(아이템에 대한 정보)을 보여줍니다.

아이템을 클릭하면 사용할 것인지, 살펴볼 것인지, 떨어뜨릴 것인지 결정할 수 있습니다.

Examin을 누르면 이렇게 동작합니다.

Examin을 구현하기 위해 맵에서 조금 떨어진 공간에 Examin Actor를 만들어서 SceneCapture2D를 이용해 랜더링 정보를

Render Target(실시간으로 업데이트되는 텍스처)에 넘겨줬습니다.

이후 받은 랜더링 정보를 Material형식으로 만들었습니다.

이걸 플레이어의 UI에 Image형식으로 보여줬습니다.

3. 숨을 수 있는 오브젝트 (Locker)

Linetrace를 사용해서 Locker에 숨거나 Locker에서 나올 수 있게 구현했습니다.

Locker는 Enemy의 추격을 피할 수 있는 위치로 이에 대한 설명은 아래 Enemy쪽에서 더 적을 예정입니다.

Arrow Component를 이용해 로커에 들어갈 때의 위치와 방향, 들어갔을 때의 위치와 방향, 나올 때의 위치와 방향을 설정했습니다.

Thimeline과 float curve를 이용해 부드럽게 로커에 들어가거나 나올 수 있도록 TimelineEvent들을 활용했습니다.

4. 정보를 알려주는 메모 아이템.

이 아이템은 글이 써져 있을 뿐이지 Examin과 거의 동일하기 때문에 설명은 생략합니다.

한글폰트 설정.

언리얼 한글폰트

 

언리얼 한글폰트

언리얼 한글폰트. UE5에서 한글 폰트를 적용하는 방법에 대한 글입니다. 해당 글에서 사용한 폰트는 눈누라는 사이트에서 받았습니다. UMG에 한글폰트 적용하기. UMG 간단합니다. 다운받은 TTF 파일

intunknown.tistory.com

5. 상호작용 가능한 자물쇠.

비밀번호는 C++의 생성자에서 생성합니다.

이후 필요하다면, Beginplay에서 비밀번호를 수정할 수 있습니다.

자물쇠에 상호작용하면 SetViewTargetWithBlend함수를 사용해 플레이어의 시점에서 설정된 Camera Component 시점으로 부드럽게 변경됩니다.

이후 자물쇠에 넣어놓은 UI위젯과 상호작용해 비밀번호를 설정맞추면 됩니다.

비밀번호를 맞추면 자물쇠개 풀리는 애니메이션이 발생하고 사라집니다.

시점변경에 관련된 영상.

언리얼 카메라 시점 변경 c++

 

언리얼 카메라 시점 변경 c++

언리얼 카메라 시점 변경 c++언리얼에서 c++을 이용해 카메라 시점을 변경 하는 방법에 대해 보여주는 글입니다.이 글에서는 'SetViewTargetWithBlend'함수를 활용해 카메라 전환 시 부드러운 화면 전환

intunknown.tistory.com

6. 문

문은 처음에 한쪽으로만 열리는 문, 양쪽으로 열리는 문, 물리가 적용되는 문 이렇게 3종류를 만들었습니다.

처음에 이 프로젝트를 시작하면서 열쇠를 숨겨놓고 찾아서 탈출하는 쪽이 공포게임에서 흔한 종류라고 생각했습니다.

그래서 열쇠를 찾고 탈출할때 상호작용없이 물리적으로 문을 여는 것 보다 상호작용을 통해 문을 여는쪽이 나중에 더 좋다고 생각해서 다음 방법을 선택했습니다.

Enemy가 플레이어를 추적할 수 있도록 하기 위해 Can Ever Affect Navigation 설정을 False로 설정하고, Overlap함수를 이용해 Enmey가 문의 Collision에 접근하면 열리고 Collision을 벗어나면 문이 닫히도록 만들었습니다.

7. 분위기

깜빡이는 조명

SetTimer함수를 이용해 Delay시간후 Intensity를 변경해 깜빡이는 조명을 구현했습니다.

BGM

오브젝트 하나에 BGM을 위한 Sound를 넣었습니다.

8. Attribute.

HP System.

HP는 피해, 회복, UI모두 구현했지만 잡히면 죽는 몬스터 하나만 구현해서 사실상 쓰이지는 않습니다.

Stamina System.

걷기와 달리기가 존재해서 달리기를 하면 스태미너가 줄어들고, 일정시간 달리지 않으면 스태미너를 조금씩 회복합니다.

Battery System.

손전등이 존재해서 손전등을 사용하면 배터리가 소모되고, 소모된 배터리는 "배터리"아이템을 이용해 회복가능합니다.

 

9. Enemy

1. Behavior tree를 이용해 Enemy의 행동을 구현했습니다.

2. 이동은 이동 가능한 위치중 랜덤한 위치로 이동합니다.

3. 이동하는 중에 플레이어를 발견하면 특정한 소리를 내며 플레이어를 쫒아옵니다.

4. 플레이어는 Locker에 숨어서 회피할 수 있으며, Enemy 시야에서 Locker에 숨으면 발각되어 게임이 종료됩니다.

5. 플레이어를 인지한 경우 고개를 플레이어를 향해 돌립니다.

6. 플레이어를 놓친 경우 놓친 위치의 근처에서 약 3번정도 찾아보고 다시 플레이어를 찾기위해 배회합니다.

게임 테스트 영상입니다.

https://youtu.be/CH1fWj39H3Q?si=P_lkaf7gFQVpZTmI

 

Designed by JB FACTORY