본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 블루프린트

[언리얼/블루프린트] 언리얼 엔진 둘러보기 & 블루프린트 입문

by jaboy 2024. 12. 16.

언리얼 엔진 공부 시작!

스파르타 코딩클럽 - 내일배움캠프 - 언리얼 엔진 게임 개발

스파르타 코딩클럽에서 제공하는 내일배움캠프의 언리얼 엔진을 사용한 게임 개발 트랙에 참여하게 되었다. 학부 때 Computer Science 전공으로 수업을 듣고 과제를 했던 것 외에는 개발 경험이 없기에 처음부터 시작하는 마음으로 분발해야겠다. 블로그 글 형식으로 새로 배우는 내용 위주로 정리하는 습관을 들이고자 한다.

게임 개발 요소

- 기획

- 그래픽

- 프로그래밍 : 오디오 시스템, 입력 시스템, 그래픽 표현

 

게임 엔진 Game Engine

- 그래픽, 사운드, 물리 엔진, AI 기능, 네트워킹 등 게임의 다양한 요소를 하나의 엔진에서 개발할 수 있는 기능을 기본으로 탑재하고 있어 프로그래밍을 더 용이하게 해주는 도구이다.

- 언리얼 개발자 커뮤니티(Epic Developer Community Forums)를 활용해 질문에 답을 받거나 개발 중인 내용에 대한 피드백을 받을 수 있다. (+ StackOverflow)

- 공식 문서, 유튜브 강좌, 블로그 포스트 등 레퍼런스와 튜토리얼이 많이 있다.

- 자체 게임 엔진을 개발하는 회사도 있지만 개발 및 유지보수에 많은 시간, 비용, 인력이 필요해 많이 줄어들었다.

 

언리얼 엔진 Unreal Engine

- vs. 유니티

언리얼 엔진: 대규모 혹은 고사양 3D 게임에 적합하다. 신기술의 도입이 빠르다. 대형 회사 채용 시 자격사항인 경우가 많다.

유니티: 간단한 프로젝트나 2D 프로젝트 제작에 적합하다.

 

- 블루프린트 노드

프로그래밍 언어 대신 '노드'라는 블록과 같은 요소들을 구성함으로써 게임을 완성하는 것까지 가능한 비주얼 스크립팅 방식이다. 다만 프로그래밍 언어를 사용하는 것보다 구조가 복잡해지거나 최적화가 부족하다.

 

- 언리얼 엔진에서 공개한 소스 코드 (버전 5.5) - GitHub 계정 연동만 해놓았다. 나중에 조금 더 익숙해지면 살펴보려 한다.

 

- 공식 도큐멘테이션 - 어떤 내용이 있는지 대략의 목차를 살펴보았고, 인터페이스와 기초 용어를 살펴보았다.

 

블루프린트 기초 강의 수강

1~2주차 - 블루프린트 둘러보기 / 액터 구현해보기

- 변수 - 이름과 자료형 선언, Get / Set 으로 변수 값을 불러오거나 변수 값 설정

- 매크로 - 입력값을 받아 연산 등 처리하여 특정 값 출력

- Flow Control: Sequence, Branch (= if / else), While Loop, For Loop (+ with break), For Each Loop (배열 iterate)

- 클래스 / 상속 / 서브클래스

- Actor - Pawn (빙의 Possess) - Character 직계

- 1. 3D 모델 / 2. 머티리얼 / 3. 라이팅 컴포넌트

- 스켈레탈 메시: 스태틱 메시와 달리 애니메이션에 따라 변형되는 메시 

- 블루프린트 그래프 - 메시 컴포넌트 추가, 머티리얼 적용

- 머티리얼 그래프 - Texture Sample 노드 이용해 텍스쳐(이미지 등)를 베이스컬러로 적용

- 라이트 컴포넌트 - Point Light

- 스프링 암 - 액터에 충돌체 부착 (보통 카메라 컴포넌트) - 기본 거리 유지하며 액터를 따라가고, 이동 중 다른 오브젝트 충돌 시 충돌하지 않을 만큼으로 거리가 좁혀는(?) 스프링 같은 컴포넌트인가보다... 

- 이벤트 그래프 - 실행 시 (BeginPlay) 와 매 프레임 (Tick) 마다 노드 호출

- 블루프린트 그래프 - Event Tick 에서 Delta Seconds 값을 이용한 Location (벡터 연산, Sin(degrees) 사용), Rotation, Scale 변경

 

3주차 - 캐릭터 구현하기

- 스켈레톤 에셋 : 뼈대 구조 / 피직스 에셋 : 충돌체 범위

- 캐릭터 추가 - 자손 블루프린트 클래스 생성

- 스켈레톤 메시 (+ 컴파일), 머티리얼 적용

- Location, Rotation, Scale 조정

- 스프링 암, 카메라 컴포넌트 추가

 

BeginPlay 설정

- 입력을 받기 위해서 Player Controller 빙의

- 인풋 매핑 컨텍스트 추가

- 카메라 활성화

Input Action 입력 액션 (IA_xxx)

  >> 일시정지 시 트리거 : 게임 일시정지되었을 때 동작할지 결정

  >> 값 타입 (제일 중요)

     - Digital : 예를 들어 눌렸는지 안눌렸는지

     - Axis1D : 가속. 후진 등 1/-1 값

     - Axis2D or 3D : 2 혹은 3개의 축 float vector

  >> 트리거 설정

 

Jump 구현

- IA_Jump 값 타입 : 스페이스 바 눌림/안눌림이므로 Digital(bool) / 트리거 : '눌림' (Pressed)

- Input Mapping Context 입력 매핑 컨텍스트에서 생성한 IA를 키 입력에 매핑 (IMC_xxx)

  >> 입력 액션에 키보드 키 등 매핑

  >> 여기에서도 트리거 추가 가능

- 이벤트그래프

  >> 인풋 액션을 노드로 불러와 Jump 노드 연결

  >> Get EnhancedInputLocalPlayerSubsystem - Add Mapping Context (*정확한 이해를 위해 추가로 찾아봐야겠다.)

 

 

Move 구현

- IA_Move 값 타입 : Axis2D (전후좌우) / 트리거 : '다운' (press and hold)

- 인풋 매핑 컨텍스트에서 IA_Move를 모디파이어 활용해 여러 가지 키 입력에 매핑

*모디파이어 : 하나의 입력 값을 여러가지로 변환 

    - W : x축 + --> 입력 값 그대로 사용 (= None)

    - S : x축 - --> 부정 (Negate = 입력 값 반대로)

    - A : y축 - --> 부정 & 스위즐 입력 축 값 (다른 축 전환 & 반대로)

    - D : y축 + --> 스위즐 입력 축 값 (다른 축 전환)

- 이벤트그래프

  >> 캐릭터 무브먼트 컴포넌트 - Add Input Vector

  >> 2D vector 이기 때문에 X, Y로 break vector 2D

  >> 인풋 벡터의 X값 (WA ~ 전후 ~ +-)과 액터의 현재 앞방향 벡터를 곱

  >> 인풋 벡터의 Y값 (DS ~ 좌우 ~ +-)과 액터의 현재 우측방향 벡터를 곱

* 왜? 인풋액션에서 받은 벡터는 절대적인(월드의) XY 축 기준의 방향을 가리키므로 현재 액터의 방향과 곱해 현재 액터 기준의 전후 / 좌우를 가리키게 한다.

  >> 두 곱한 벡터를 더해 최종적인 무브먼트 벡터로 만들기 --> Add Input Vector에 피입력한다.

 

Look 구현 (마우스 이동에 따라 시점 회전)

- IA_Look 생성 후 인풋 매핑 컨텍스트에서 '마우스 XY 2D 축'에 매핑 *별도 트리거 없음. 당연히.

- 이벤트그래프

  >> Action Value 의 x 값 (좌우) 은 z 축 기준 회전 (= yaw) --> Add Controller Yaw Input

       y 값 (상하) 은 multiply by -1 & x 축 기준 회전 (= pitch) --> Add Controller Pitch Input

- 스프링 암 - 디테일 - 폰 제어 회전 사용 체크

- 뷰포트에서 캐릭터 선택 --> 디테일에서 컨트롤러 요 회전 사용만 체크 (피치, 롤은 카메라만 회전하고 캐릭터컨트롤러는 회전하지 않아야하기 때문)