본문 바로가기

내일배움캠프

내일배움캠프 언리얼트랙 2일차

본 캠프 2일차가 되었습니다! 날씨가 갑자기 쌀쌀해졌고 대기질도 좋지 않아요. 외출시 마스크 착용! 그럼 오늘도 열심히 달려볼게요!

2026 - 04 - 21


오늘의 학습

- C

- UnrealEngine


 [ C ] 

 

 

 stdio.h 

standard input output header의 약자로, C언어에서 표준 입출력 함수를 정의해둔 헤더 파일이다.

 

 

 printf() 함수 

print formatted의 약자로 '양식에 맞게 출력하다'라는 뜻이다.

탈출 문자열 혹은 서식 지정자와 함께 사용된다.

 

 

 탈출 문자열 ( Escape Sequence ) 

탈출 문자 ' \ '와 함께 작성된 문자열.

문자열의 시작 "(큰따옴표) 와 끝 "(큰따옴표) 사이에 넣어서 사용해 잠시 문자열을 탈출한다.

 

- \n : 개행 (다음 줄로 넘기는 기능)

- \t : 탭 (tap키 기능 )

- \' :  따옴표 출력

- \" : 큰따옴표 출력

- \\ : 역슬래시 ( \ ) 출력

- %% : %출력

 

 

 #include <stdio.h> #include "stdio.h"의 차이 

각괄호는 시스템 경로에서 먼저 탐색

큰따옴표는 일단 우리 프로젝트 내에서 먼저 탐색하고 없으면 시스템 경로로 가서 탐색

 

 

 진법 
1진법, 2진법, 3진법, 4진법,...
진법 => "~개 셀 수 있다."
1진법 => 한 칸에 1개 셀 수 있다. -> 0
2진법 => 한 칸에 2개 셀 수 있다. -> 0 1
4진법 => 한 칸에 3개 셀 수 있다. -> 0 1 2 3
8진법 => 한 칸에 4개 셀 수 있다. -> 0 1 2 3 4 5 6 7
10진법 => 한 칸에 5개 셀 수 있다. -> 0 1 2 3 4 5 6 7 8 9
16진법 => 한 칸에 16개 셀 수 있다. -> 0 1 2 3 4 5 6 7 8 9 a b c d e f
컴퓨터: 2진법 8진법 10진법 16진법

 

 

 서식 지정자

입출력 함수들과 함께 쓰여 양식에 맞게 입출력 하도록 돕는 지정자

문자열의 원하는 위치에 서식 지정자를 넣어 사용

 

- %d : decimal. 10진수로 대체

- %o : octal. 8진수로 대체

- %x, %X : hexadecimal.10진수 정수를 16진수 문자열로 대체. x는 소문자, X는 대문자로 표기.

- %u : unsigned. 양수로 대체

- %c : character. 문자로 대체

- %s : string. 문자열로 대체

- %f : floating point. Single Precision(단정밀도) 실수로 대체. float에 사용

- %lf : double precision floating point(고정밀도). double에 사용

 

 


 [ UnrealEngine ] 

 

Blueprint FPS 슈팅게임 제작.

FPS_Character 블루프린트 생성 및 셋팅 / 이동&마우스 조작 / 조준(ADS) / 애니메이션 블루프린트 기초

 

 FPS_Character 블루프린트 생성 및 셋팅 

 

Blueprirnt Class - Character - 이름 'FPS_Character'로 변경

FPS_Character의 Components 탭에서 Camera 추가 및 위치 조정

FPS_Character의 Components 탭에서 Skeletal Mesh 추가 및 이름 'Gun'으로 변경

 

FPS_Character의 Gun에 M16_scope를 선택해서 총을 넣는다.

FPS_Character의 Mesh에 SK_Mannequin_Arms를 선택해서 팔을 넣는다.

 

팔이 총을 잡고있어야 하므로 우선, Mesh의 Animation Mode를 Use Animaion Asset으로 변경하고 Anim to Play에 FP_Rifle_Idle를 선택한다. 이렇게 하면 총을 들고 있는듯한 모션을 취하게된다.

 

이제 팔에 총을 추가해보자. SK_Mannequin_Arms_Skeleton에서 Preview Animation을 FP_Rifle_Idle로 선택한다.

hand_r - 우클릭 'Add Socket' - hand_rsocket 우클릭 -Add Preview Asset - SK_M16_Scope

위치와 각도를 잘 조정해서 팔이 총을 취고있는것처럼 조절한다.

 

이제 FPS_Character의 Construction Script에서 노드를 설정하고 컴파일 후 뷰포트를 확인하면 손이 총을 잘 잡고 있는걸 확인할 수 있게된다.

 

이 방법 말고 더 쉬운 방법이 존재한다. 상속 관계를 이용하는것이다.

우선, FPS_Character에 들어가서 Gun을 Mesh로 드래그 앤 드랍 해 Mesh의 자식으로 Gun이 들어가게 한다.

Construction Script의 노드들은 모두 지워버린다.

Gun의 디테일 창에서 Sockets - Parent Socket - Select Box - hand_rSocket 이렇게 하면 총이 손에 잘 붙어있게 된다.

 

이후 Muzzle Flash 위치를 총구의 끝으로 설정하기 위해 SceneComponent로 추가한다.

 

 오류 

컴파일을 했는데 손이 총을 잡고있지 못하는 상황

원인을 분석해보니 노드를 잘못 연결해놓았다.

잘못 연결된 노드

Target과 Parent에 연결되어야 하는것이 서로 바뀌었다.

Target에는 Gun, Parent에는 Mesh가 연결되어야 한다. Mesh에 Gun이 붙는 구조이기 때문이다.

노드를 고치고 다시 컴파일하면 손에 총이 잘 붙어있는걸 확인할 수 있었다.

정상적으로 고쳐졌다!

 Day 1. 숙제 

[과제 0] 새로운 프로젝트 생성 후 오늘 배운 내용 다시 복습

 

[과제 1] 조준 관련 변수 추가

변수명 타입 기본값 힌트
DefaultFOV Float 90.0 일반 시야각
AimFOV Float 60.0 조준 시 좁아지는 시야각
(시야확대)
IsAiming Boolean false 조준 중인지 여부

 

[과제 2] 캐릭터 배치 확인

1. 이집트 맵에 FPS_Character를 삭제

2. 이집트 맵에 FPS_Character를 배치하세요

3. Details에서 Auto Possess Player를 Player 0으로 설정하세요

4. Play버튼을 눌러 카메라 시점이 나오는지 확인하세요

 

[과제 3] (도전) Print String 활용

  • FPS_Character의 EventGraph에서 BeginPlay이벤트에 Print String 노드를 연결하세요
  • 첫 번째 Print String : 자신의 캐릭터 이름이나 인사말을 출력
  • 두 번째 Print String : 변수 CurrentAmmo를 Get으로 가져와서 연결하고 탄약 수가 출력되는지 확인하세요

첫 번째 Print String 캐릭터 이름이나 인사말 출력
캐릭터 이름과 인사말 출력 확인
두 번째 Print String 변수 CurrentAmmo를 Get으로 가져와서 탄약 수 출력
탄약 수 30개 확인

 

 

 이동 & 마우스 조작 

 

- 입력 매핑 : 키보드/마우스 버튼을 누르면 어떤 동작을 수행할지 연결해주는 것

- IMC ( Input Mapping Context ) : 입력 매핑들을 하나로 묶어놓은 묶음

- IA ( Input Action ) : 동작을 정의한 것

 

IMC와 IA를 추가한다. (IMC_FPS, IA_Look, IA_Move)

IA_Look와 IA_Move의 Value Type을 Axis2D로 설정한다.

IMC에서 IA_Move, IA_Look을 매핑한다.

여기서 IA_Lookk을 Mouse XY 2D-Axis로 설정한다.

 

- Axis2D :  X축과 Y축의 2차원적인 2개 float 값(FVector2D)을 동시에 처리하는 입력값 타입을 의미. 모니터를 기준으로 가로축은 X축, 세로축은 Y축으로 하여 마우스가 좌우로 이동하면 X값이 -1, +1 이 되고, 위아래로 움직이면 Y값이 +1, -1이 된다.

 

IA_Move에 W,S,A,D키를 할당한다.

여기서, 키보드 입력은 전부 X = +1이기 때문에 그대로 사용하면 안된다. W(전진), S(후진), A(좌측이동), D(우측이동)을 구분하기 위해서 Modifiers를 설정해주어야 한다.

 

Swizzle Input Axis Values는 X축을 Y축으로 변경해준다. 즉, Y축을 필요로하는 W, S키에 할당한다.

Negate는 부호를 변경해준다. 기본적으로 입력은 X = +1이다. 만약 Negate를 적용하면 X = -1 즉, 좌측이동이 가능하게 된다. 만약, Swizzle과 Negate를 같이 적용하면 X축 -> Y축, 부호가 바뀌면 Y = -1. 즉, 후진이 가능하게 된다.

 

W : Swizzle Input Axis Values

S : Swizzle Input Axis Values , Negate

A : Negate

D : 변경 없음

 

FPS_Character에서 블루프린트 노드를 연결하고 실행해보면 잘 움직인다. 그런데 화면의 움직임이 불편하고, 마우스를 위아래로 움직일때 팔은 가만이 있는것을 확인하였다.

 

FPS_Character - Camera - Detail - Use Pawn Control Rotation -> False

카메라를 돌리는것이 아닌 Pawn 자체를 돌려서 카메라의 움직임에 팔이 따라가도록 한다.

FPS_Character - Detail - Use Controller Rotation Pitch, Use Controller Rotation Yaw -> True

 

Use Controller Rotation Pitch / Yaw 를 True로 켠다는 건, 캐릭터가 Controller(플레이어 입력 기준 회전값)를 따라 몸이 회전하도록 하겠다는 뜻

  • Controller = 플레이어가 마우스나 패드로 바라보는 방향
  • Character = 게임 속 캐릭터 몸체

True로 켜면 내가 보는 방향 = 캐릭터 몸 방향

Yaw : 좌우 회전
Pitch : 상하 회전

 

언리얼에서는 +Y로 하면 아래로 나려가게 설정되어있었다.

변경하기 위해 IMC_FPS에서 IA_Look의 Modifiers에 Negate를 추가한다.

Negate에서 Y축만 True로 하고 나머지는 False 처리한다.

 

원하는대로 잘 작동되는걸 확인하였다.