프로그래밍/Unreal 부트캠프

TIL 2024.12.19 기록

Rozentea 2024. 12. 19. 23:24

0. 개요


오늘은 실제로 움직일 수 있는 캐릭터를 직접 만드는 강의를 들었다..!

또, 레벨 디자인에 대해서 간단히 배우고, 직접 레벨 디자인을 해보는 시간을 갖었다.

 

레벨 디자인 초안을 손으로 직접 그린 다음 직접 구현해보는 과제를 진행했는데, 진짜!!!!!!!!!!! 재미있었다!

드디어 게임을 만드는 느낌이 들고, 레벨을 어떻게 구성하고, 플레이어의 동선은 어떻게 될 것이고, 기믹들은 어떤 것들을 추가할 것인지 등등 상상력을 마음껏 발휘할 수 있는 시간이라 좋았다.

 

특히 맵의 분위기가 사이버펑크 스러운 느낌이 들기도해서 하는 내내 사이버펑크 앳지러너 노래를 들으면서 작업했다. ><b

 

우선 오늘 배운 내용중에 새로 알게된 부분을 정리한 뒤, 오늘 진행한 과제를 기록하고 마칠 것이다.

 

1.  에디터 프레임 확보하기 및 새로 알게된 부분


1. 엔진 퀄리티 셋팅 변경하기

원래 알고 있긴했던 기능이지만, 나중에 까먹으면 찾아야하니 기록하는게 좋을 것 같다.. : )

 

2. 실시간 옵션 끄기

실시간 옵션을 끄면, 애니메이션, 파티클, 머티리얼 애니메이션 등등을 뷰포트에서 미리 실행시켜주지 않는다.

ㄴ 실시간이 켜있을 때 파티클을 배치하면 파티클이 뷰포트에서 실행되고 있는데, 끄면 실행하지 않는 이상 보이지 않는것 같다.

 

또 해당 창에서 FPS 표시, 통계 표시 등등 다양하고 유용한 기능들이 있어서 한번 봐두면 좋을것 같다.

 

3. 콘솔창에 t.MaxFPS를 입력하기

t.MaxFPS 수치를 입력하면 프레임을 강제로 낮출 수 있다.

즉, 원하는 최대 프레임 고정 명령어다.

기본적으로 120 프레임으로 설정되어있고, 't.MaxFPS 0'을 입력하면, 기본 프레임으로 적용된다.

 

4. 프로젝트 엔진 버전을 변경했는데, 런처에서는 바뀌지 않는 버그

프로젝트의 엔진 버전을 변경했는데, 런처에서는 아직 바뀌지 않아서 엔진 버전에 맞는 에셋을 임포트해도 경고창이 뜨는 오류가 있는것 같다.

나는 아직 걸리지 않았지만..

아무튼 이경우는 프로젝트 엔진 버전은 정상적으로 변경됐는데, 런처 캐싱에 남아있는 정보가 아직 갱신되지 않은 이전 정보여서 이런 오류가 발생하는것 같다고 하신다..

어쨌든 프로젝트 엔진 버전을 이미 올린것으로 처리가 되었다면, 경고가 발생해도 정상 동작하기 때문에 문제될건 없다고 한다.

 

5. 면에 닿는 곳 까지 액터 내리기 (END키)

면이라고하기엔.. 좀 다른 느낌이지만..

액터 선택 후 End 키 : z축 기준으로 다른 액터와 맞닿는 곳까지 액터를 이동시켜준다.

만약 해당 액터가 콜리전이 있다면, 콜리전 끼리 닿는곳까지 액터를 이동시킨다..!

 

6. 이름바꾸기 단축키!

이름을 바꿀 대상 클릭 후 F2 : 이름을 바로 변경할 수 있다..!

이전에도 계속 쓰다가도 까먹어서 기록해두는게 좋을것 같았다. ㅋㅋㅋ

 

7. 블루프린트 이밴트 그래프에서 분할점 만들기

연결된 선의 위에서 원하는 곳을 더블 클릭하면 생성이 가능하다.

 

2. 캐릭터 구현


1. 스켈레탈 메시

리깅이라는 작업을 통해서 뼈가 추가되어 있는 메시이다.

이러한 뼈와 관절이 있기 때문에 캐릭터 애니메이션을 만들 수 있다.

또, 소켓을 만들어 무기를 장착한다던지, 무기의 공격 범위를 만들어 피격 판정을 하는등을 할 수 있다고 한다.

ㄴ 스켈레탈 메시의 경우 내일 애니메이션 적용 및 블랜딩하기 강의를 통해 더 다룰거 같기 때문에 자새한 내용은 내일 찾아보고 기술하겠다.

 

2. 스프링 암 컴포넌트 (Spring Arm Component)

카메라가 스프링암에 달려 함께 움직이다가 벽이나 어떤 오브젝트에 가로막히게 될 경우 스프링암 길이를 자동으로 조절해 카메라를 당겨준다.

-> 즉, 기본으로 주어진 값을 유지하며 움직이다가 충돌이 발생하면 암의 길이를 조절하면서 카메라가 액터를 넘어가서 찍지 않도록 해준다.

-> 전에 모작 프로젝트를 진행할 때, 스프링암 기능을 만들지 않아서 벽을 통과해 카메라를 찍는 문제가 있었는데, 이번에 사용해보니 스프링암이 어떤거고, 정말 필요했구나..를 느낄 수 있었다.

 

3. 시네 카메라와 일반 카메라의 차이

일반 카메라는 플레이어 시점 친화적인 카메라라고 생각하면 되고,
시네 카메라는 컷신 제작 및 연출에 친화적인 카메라로 생각하면 된다고 하신다.

 

추가적으로 일반 카메라는 게임플레이에 최적화된거라 실시간 성능에 초점을 두고, 빠른 성능을 위해서 플레이어의 시점이나 간단한 연출에 사용된다고 한다.

시네카메라는 영화 촬영 기법을 모방한 고급(비싼?) 카메라 같은것이고, 피사계 심도, 초점 거리, 조리개 막 이런 효과들이 다 되는거고 영화 같은 장면 제작에 쓰인다고 한다.

 

이전부터 그냥 좀더 기능이 많은 카메라겠거니.. 했는데, 일반카메라가 게임에 최적화 되어있고, 실시간 성능에 초점을 두었다는것은 처음알게 되었다.

시간이 날때 시네카메라와 일반카메라의 차이점도 정리해서 기록해두어야겠다.

 

3. 입력


어찌보면 제일 중요하다 생각되는 입력에 대해 배울 수 있어서 좋았다.

 

0. 향상된 입력 시스템

언리얼 엔진 5.0 버전이 나오면서 이전에 프로젝트 셋팅에서 하던 축 매핑, 액션 매핑을 더 강화해 따로 추가해준 기능이다. (좀 더 조사해보기)

프로젝트 세팅으로 키 매핑을 해봤었는데, 그때보다 확실히 괜찮은것 같다.

이전에도 언리얼을 잘 안 다뤄봤어서 몰랐을 수도 있지만..

이전에는 단순히 키가 눌릴때, 해제될 때 2가지만 체크가 가능했던거 같은데, 이번엔 더 세분화된 느낌이었다.

 

1. 입력 액션

생성후 디테일 탭을 확인해보면, 액션을 사용하는 키는 각 타입이 무엇인지 정 할 수 있다.

우선 지금은 2D로만 움직일 것이기 때문에 2D 입력으로 받았다.

 

 

2. 입력 매핑 컨텍스트

디테일 탭에서 이전에 생성한 입력 액션을 매핑하고, 키를 지정해 줄 수 있다.

또한, 모디파이어를 통해 어떻게 동작할 것인지를 정해줄 수 있다.

스위즐 입력 축값 : 1D 입력을 2D 액션에 y축 매핑을 하는데 유리하다고 한다.

부정 : 축입력 반전이다.

 

3. !! 캐릭터 이동 입력 생성시 주의사항 !!

캐릭터의 방향이 월드의 x축으로 할지 y축으로 할지를 정해주어야 한다.

예를 들어 y축을 보고 있는데, w키 입력을 x축 이동으로 해버리면 정면으로 캐릭터가 이동하는게 아니라 게걸음을 치게될 것이기 때문이다.

 

캐릭터가 바라보는 방향을 월드의 x축으로 할지 y축으로 할지는 모델을 만드는 모델러, 실제 캐릭터를 만드는 프로그래머(?)마다 모두 다르다고 한다.

 

4. 블루 프린트를 이용해 키 맵핑하기

Get Player Controller : 캐릭터 빙의를 설정할 때보면 Player0, player1 등있는데, 몇 번째 idx의 player의 컨트롤러를 가져올 것인지인 노드

Enhanced input local player subsystem : 플레이어로 부터 향상된 입력 서브 시스템을 받아오는 노드이다.

Add Mapping Context : 받아온 향상된 입력 서브 시스템 인터페이스에 우리가 만든 매핑 컨텍스트를 전달해 지정해준다.

 

4. 캐릭터의 기능 구현


1. 이동 기능 구현

향상된 입력 시스템을 사용하면, 추가한 입력 액션에 따른 이밴트가 추가된다.

단순히 누르고 있을 때 뿐만아니라, 다양한 입력 순간을 판별할 수 있도록 구현되어 있다.

 

Add Movement Input : 폰에게 얼마만큼 이동할지 Vector로 전달해 이동시켜준다.

                                   ㄴ 우리는 방향 벡터를 전달하고, Scale Value를 전달해 해당 방향으로 얼마만큼 이동값을 더할지 방식으로 사용했다.

Get Forward Vector : 월드 전방 벡터를 주어진 회전값 만큼 회전한다.

Get Right Vector : 월드 오른쪽 벡터를 주어진 회전값 만큼 회전한다.

GetControl Rotation : 대상의 회전 값을 가져온다.

 

즉, 우리 캐릭터가 얼마나 회전을 했는지 가져와, 월드의 방향벡터들을 그만큼 회전해 캐릭터에 전달할 방향벡터를 구한다.

이후 키입력을 통한 스케일 벨류를 전달 받아 이동을 처리한다.

 

!!주의할점!!

위 방법 대신

Get Actor Forward Vector, Get Actor Right Vector를 사용하면 부드러운 이동은 되지 않는다.

(이때가 잘 기억이 나지않으니 내일 해당 프로젝트 최종본 만들 때 실험해 볼것.)

 

2. 시야 돌리기 기능 만들기

Add Controller Yaw Input : Controller Rotation에 Yaw입력을 추가한다.

Add Controller Pitch Input : Controller Rotation에 Pitch입력을 추가한다.

Yaw와 Pitch만 사용한 이유는 마우스가 2D로만 움직이기 때문이다.

 

3. 캐릭터 설명 변경하기

처음 완성을 했을 때 시야 회전이 아래쪽이 먹통이었다.

우선 캐릭터 무브먼트 컴포넌트에서 '무브먼트 방향으로 회전'을 true로 설정했다.

'무브먼트 방향으로 회전'은 캐릭터가 가속하고 있는 방향으로 천천히 캐릭터를 회전시켜 결국 가속되는 방향과 캐릭터가 바라보는 방향이 동일해지도록 해주는 기능이다.

 

스프링암 컴포넌트의 폰제어 회전을 true로 변경했다.

'폰제어 회전'은 스프링암 컴포넌트가 폰에 추가되었다면, 가능한 폰의 뷰/컨트롤 회전값을 받아 회전을 적용하는 기능이다.

 

시야 위아래 회전이 이상해 마우스 매핑의 모디파이어를 부정으로 설정해주었다.

 

5. 레벨 디자인


1. 레벨 디자인이란?

게임 내에서 플레이어가 경험할 수 있는 환경과 구조를 만드는 과정이다.

플레이어의 경로, 도전, 그리고 스토리를 설계하며, 게임플레이의 재미와 균형을 조화롭게 담아내야한다.

레벨 디자인은 시각적 요소의 배치를 넘어, 플레이어가 돌아다니는 환경이기 때문에 플레이어가 느끼는 경험의 핵심을 설계하는 역할이다.

레벨 디자이너는 그래픽쪽을 다루고, 최적화를 하는데 언리얼 엔진에서는 오클루전 컬링 등 다양한 최적화 기술을 지원한다.

NDC 넥슨 디벨로퍼 컴퍼런스에 레벨 디자인 튜토리얼 영상 추천한다.

자동차를 예로 들면 프로그래머는 엔진을, 아티스트는 외관을, 레벨 디자이너는 드라이브의 경험을 제공한다
Lee Perry
 

레벨 디자인

레벨 디자인은 게임 에서 사용할 맵 의 구조, 맵의 레벨 등을 설계하는 일이다. 정의 파일:external

namu.wiki

 

 

2. 직접 만들어본 레벨 디자인 초안

플레포머 게임을 만들기 위한 레벨 디자인 초안을 그렸다.

처음해보는 레벨 디자인이라 생각처럼 쉽게 쉽게 떠오르지는 않았지만, 미리 만들어진 레벨을 둘러보면서, 아이디어를 떠올렸다.

지하실 분위기의 공간을 접하고, 해당 공간을 이어서 지하실을 만들고, 해당 공간을 미로로 꾸며보자..! 라던가 가게가 있으니까 그 앞을 차가 사고난 것처럼 꾸며서 막아두고, 가게 안을 지나가게 하자! 등의 아이디어를 떠올렸다.

 

그래도 레벨을 둘러보면서 여기엔 뭘 만들지? 여기에는 뭘 배치하면 좋지? 등의 다양한 생각을 할 수 있어서 좋은 시간이었다.

 

3. 초안을 토대로 액터 배치

<배치한 미로의 모습>
<차 사고를 위장해 길을 막아두고, 가게로 진입하도록 배치>
<가게안에 배치한 레이저 함정>
<각종 움직이는 발판>
<공이 생성돼 굴러떨어지는 함정>
<회전 하는 발판>

아직 시간이 부족해 3층부터는 만들지 못해서 아쉬웠다..

내일 애니메이션 과제가 빨리 끝난다면 조금 더 진행해 마무리하고 싶다..! ㅎㅎ

아니면 주말을 이용해 조금 더 진행해볼 예정이다.

플레이 영상은 너무 길어질 것 같아서 나중에 따로 촬영해 유튜브에 올릴 것이다.

 

그래도 초안대로 잘 구현된것 같아서 만족스러웠다..!

 

6. 시간날 때 공부할 영상


 

 

 

7. 마치며


아직까지는 부트 캠프를 시작하기 전 설명회때 튜터님이 장담하셨던대로.. 과학 상자, 레고 등을 가지고 노는 듯한 느낌이 많이나고 즐거움만 가득해 신청하길 잘했다는 생각이 들었다.

 

또, 튜터님께 질문을 드리면, 답변을 빠르게 주시는 것도 있지만 항상 더 챙겨주시려는 마음이 느껴져서 더욱 더 만족감을 느낀다.

캠프 생활을 하면서, 함께 공부하는 조원분들과 가르쳐주시는 튜터님께 감사한 기분이든 하루였다..!

 

!튜터님의 오늘 과제 한줄평!

레이저가 좋았다, 미로를 만드는데 굉장한 노력과 시간이 들었을 것 같다.. 정말 고생했다..!

 

꽤 오랜 시간을 공들인 것을 알아주셔서 감사한 기분이 들었다.

레이저는.. 머티리얼을 사용해서 만든 어떻게 보면..? 눈속임이지만, 시간이 날 때 공부해 만들어보고 싶다..!

 

23:00 ~ 01:45......

이것 저것 더 만들어보고 싶은데... TIL쓰느라 시간이 너무 지나버렸다..

으아아!! 어쨰서..! 하루는 짧은 것일까..!