컴퓨터 및 게임 관련 전공인이 아닌 문외한 일반인이 언리얼 엔진을 배우면서 정리한 내용입니다.
그날그날 배웠던 내용을 제가 나중에 보기 위해 정리한 것으로, 지금 당장 보기에 부족한 점이 아주아주 많고 추후에 수정이 될 수도 있습니다.
오탈자 및 잘못 기재된 내용 지적, 부족한 내용 설명은 언제든지 환영입니다.
본글은 언리얼 엔진 5.5.4 버전 영문판을 기준으로 합니다.
----------------------------------------------------------------------------------------------------------------
18일차 학습 내용
- 1인칭 퍼즐게임 제작
달리기 기능 추가
크로스헤어 추가
잡기 기능 추가
던지기 기능 추가
카메라와 잡힌 물체의 거리 조절
스크롤로 들어올린 물건 거리 조절 기능 추가
물건 떨어뜨리기 기능 추가 및 일부 명령 수정
Interface
1인칭 퍼즐게임 제작
달리기 기능 추가

"Ia_Sprint" 생성 후 IMC에서 'shift' 키를 "Ia_Sprint" 에 바인딩 해준다.


그리고 Player BP에서 위 그림과 같이 2가지 연결 방식으로 작성이 가능하다.

Player BP의 "Character Movement" 를 누르고 우측 탭의 "Character Movement (General Settings)" 에서 이동 관련 설정이 가능하다.
"Gravity Scale" 에서는 캐릭터가 받는 중력의 크기를 조절할 수 있고, "Braking Friction Factor" 에서는 캐릭터에게 적용되는 마찰력 조절 수치를 조절할 수 있다.
두 설정 모두 수치가 높으면 커진다.
"Crouch Halfed Height" 는 캐릭터가 웅크렸을 때의 키를 조절할 수 있고, "Default Land Movement Mode" 는 캐릭터가 기본적으로 이동하는 상태를 정해줄 수 있다.
크로스헤어 추가
크로스헤어는 Widget에서 보이게 해야하는 기능이다.
Widget Blueprint (이하 'WBP' 라고 칭함) 를 생성해준다.

캔버스와 이미지를 드래그해서 놓아주고, 이미지를 Anchor를 통해 정중앙에 배치해준다.
이미지에 크로스헤어 이미지를 삽입해준 뒤 "Size to Content" 를 체크해주고, 불투명도를 조절해주기 위해 "Color and Opacity" 에서 'Tint' 의 'a' 수치를 '0.5' 로 해준다.

그리고 Player Controller BP에 가서 "Create WB HUD Widget" 노드를 통해 위에서 제작한 WBP를 추가해준다.
*Widget 은 'Player Controller' 에서 관리해줌
잡기 기능 추가

1인칭 게임에서 물건을 잡는 등의 상호작용을 할 때 16일차에서 배웠던 "Line Trace" 기능을 이용한다.
플레이어로부터 광선을 쏘고, 광선이 액터에 닿으면 해당 액터의 특징 (물리작용 가능 여부 등) 을 파악한 뒤, 해당 액터의 특징이 상호작용이 가능한 경우 잡게 되는 과정을 거친다.
우선 항상 하던 것처럼 "IA_Interact" 를 생성한 후, IMC에서 좌클릭으로 바인딩해준다.
그리고 게임의 전체적인 기능들을 관리할 "Puzzle Engine" BP 액터를 생성해준 후, 해당 BP 액터에 "Physics Handle" 을 생성해준다.
"Physics Handle" 은 1인칭 게임에서 물건과 상호작용할 때 쓰이는 핸들 역할을 한다.


"Puzzle Engine" BP에 'Check Trace' 라는 함수를 새로 생성해주고, "Camera Component" 변수를 생성해준 뒤, 'Check Trace' 라는 함수에 위 그림과 같이 노드를 작성해준다.
"Line Trace By Channel" 노드에서 'Trace Channel' 의 'Visiblity' 는 카메라에 보이는 것들만 체크하는 기능이고, 'Draw Debug Type' 은 "Line Trace" 의 "Line" 을 가시화 해주는 기능인데, 'Persistent' 로 할 시 "Line" 이 영구적으로 표시된다.
"Get Center of Mass" 는 해당 Mass의 중심점을 가져오는 노드이다.
위 BP를 해석하면 플레이어의 카메라를 시작점으로 카메라가 보는 각도로 1000의 거리만큼 "Line" 을 발사하여, 카메라에 들어오는 것들 중에 "Line" 에 부딪히는 것이 있다면 해당 컴포넌트를 잡는 명령을 내리는 것이다.
*'Bone Name' 은 연결해주지 않아도 됨
*'Persistent' 로 설정하면 아래 그림과 같이 "Line" 이 영구적으로 표시됨

하지만 여기까지만 할 경우 정상적으로 작동하지 않는데, "Physics Handle" 은 물건을 쥐는 기능만 있기에 마우스 이동에 따라 이동하지 않는다.
그렇기에 마우스 이동에 따른 위치값을 따로 부여해줘야한다.

"Puzzle Engine" BP 의 "Tick Event" 에서 위 그림과 같이 BP를 작성해준다.
위 BP는 플레이어의 시점에서 400만큼 떨어진 거리에서 "Physics Handle" 을 유지시키면서 마우스 이동에 감응하게 해주는 것이다.


그리고 "Puzzle Engine" BP 에서 생성한 "Camera Component" 와 연결해주기 위해, Player BP의 "Player Camera" 에 'Child Actor Class' 로 "Puzzle Engine" 을 추가해주고, "Event Begin Play" 노드에 위 그림과 같이 BP를 작성해준다.

마지막으로 Player BP에서 "As Puzzle Engine" 의 get 변수에서 'Check Trace' 함수를 가져와 "IA_Grab" 노드와 연결해주면 된다.

던지기 기능 추가
우선 "IA_Throw" 를 생성한 후, IMC에서 우클릭으로 바인딩해준다.

"Ia_Throw" 생성 후 IMC에 우클릭으로 바인딩해준다.

"Puzzle Engine" BP에서 "Throw" 함수를 생성해주고 위 그림과 같이 노드를 작성해준다.
"Add Impulse" 노드는 물리적 충격을 가해주는 노드이다.
위 BP는 가지고 있는 컴포넌트가 있는 경우, 플레이어의 카메라 시점에서 앞으로 2000의 충격력만큼 힘을 가하면서 놓는 명령이다.
마지막으로 Player BP에서 "As Puzzle Engine" 의 get 변수에서 'Throw' 함수를 가져와 "IA_Throw" 노드와 연결해주면 된다.
카메라와 잡힌 물체의 거리 조절

"Puzzle Engine" BP 의 "Tick Event" 에서 작성한 BP를 복사하여 'Update Physics Handle' 이라는 새로운 함수를 생성해준다.
"Handle Distance" 변수는 '*' 노드의 빈 공간을 드래그하여 승격시켜준 것이다.

"Puzzle Engine" BP의 'Check Trace' 함수에 위에서 생성한 "Handle Distance" 의 set 변수를 사이에 삽입해주면, 플레이어의 카메라와 잡힌 컴포넌트의 거리가 자연스럽게 변하게 된다.
*아래 그림과 같이 함축할 노드들을 선택하고 우클릭을 한 뒤, "Collapse to Function" 을 눌러주면 노드 하나로 압축되게 됨


스크롤로 들어올린 물건 거리 조절 기능 추가


"IA_Scroll" 을 생성하고 "Value Type" 을 "Axis 1D" 로 설정해준 뒤, 위 그림과 같이 IMC에서 마우스 스크롤로 바인딩을 해준다.
스크롤은 마우스 휠을 위아래로 굴리는 것이기에 선형이라 "Axis 1D" 로 설정해주는 것이고, 마우스 휠을 아래로 굴리는 것은 위로 굴리는 것과 반대로 작용해야하기에 "Negate" 를 붙여주는 것이다.

"Puzzle Engine" BP에서 'Scroll' 함수를 생성하고, "Scroll" 노드에서 'Input' 의 '+' 를 눌러 입력값을 하나 추가해준다.


그리고 위 사진과 같이 노드를 연결해주고, Player BP로 넘어가 "As Puzzle Engine" get 변수에서 'Scroll' 함수를 가져온 뒤 "IA_Scroll" 노드와 연결해주면 된다.
이렇게만 하면 마우스 휠업 및 휠다운에 따른 거리 제한이 없어 무한하게 멀어지게 된다.

그렇기에 위 그림과 같이 "Clamp" 노드로 스크롤 거리 제한시켜주면 된다.
물건 떨어뜨리기 기능 추가 및 일부 명령 수정
"Puzzle Engine" BP에서 'Grab' 과 'Drop' 함수를 생성해준다.

우선 위 그림과 같이 'Check Trace' 의 뒷부분을 잘라내고 "Return" 노드를 연결해준다.
"Return" 노드 생성 후 "Line Trace" 노드의 결과핀을 드래그 하면 위 그림과 같이 'Output' 이 추가된다.

'Grab' 함수의 시작 노드의 'Input' 에 "Hit Result" 변수를 추가하고 잘라낸 'Check Trace' 함수의 뒷부분을 연결해준다.
"isHelding" 변수를 새로 생성해주고, set 변수를 연결한 뒤 True 값으로 설정해준다.
잡고 있는 상태를 True 값으로 set 해주는 것이다.
기존에 'Check Trace' 함수에서 체크하는 기능과 잡는 기능이 둘 다 있었기에, 각각의 함수 명에 맞게 기능을 나눠준 것이다.

생성한 'Drop' 함수 뒤에 위 그림과 같이 노드를 연결해준다.
잡고 있지 않은 상태를 False 값으로 set 해주는 것이다.

'Throw' 함수의 뒷부분은 'Drop' 과 상태 및 노드가 같으므로, 뒷부분을 'Drop' 함수로 바꿔준다.

마지막으로 Player BP의 'Interact' 부분에 'isHelding' 변수가 들어가도록 위 그림과 같이 수정해준다.

위 그림과 같이 'Grab' 함수에 물리작용이 적용되는지 확인해주는 노드를 넣어주면 해당 설정이 적용된 액터들만 잡을 수 있게 된다.
*액터의 일부 물리작용 설정

Mass: 무게 (단위: kg)
Linear Damping: 직선으로 날아가는 저항값
Angular Damping: 회전하는 데에 들어가는 저항값
Interface

"Interface BP" (이하 'IBP' 라고 칭함) 를 생성하고 'Interact' 라는 함수를 생성해주면, IBP에서 생성한 함수를 다른 클래스에서 불러와 사용할 수 있다.

생성한 IBP 는 불러오고 싶은 클래스의 "Interface" 탭에서 지정함으로써, 지정한 IBP 내에 있는 함수를 불러와 사용할 수 있다.

그리고 불러온 함수를 더블클릭하면 해당 'Interface' 의 함수와 관련된 이벤트를 BP로 작성해줄 수 있다.

"Puzzle Engine" BP 의 'Grab' 함수에 위 그림처럼 "Branch" 노드 이후에 연결된 것들을 추가해서, 물리법칙이 적용되지 않는 액터들 중 위에서 제작한 IBP 설정이 되어있는 액터들은 설정한 상호작용이 가능하도록 할 수 있다.

큐브의 상태를 나타내는 변수인 "State" 를 만들어서, 해당 큐브에 "On_State" 상태일 때는 True값을 주고, "Off_State" 상태일 때는 False값을 주는 것이다.
그리고 부여된 값에 따라 큐브의 마테리얼을 변화시켜주는 BP이다.

위 큐브와 연동된 State 변수를 끌고와 해당 큐브의 State의 값에 따라, 버튼 액터 중 위에 위치한 버튼의 마테리얼도 변경해줄 수 있다.

큐브와 연동된 State 변수를 'Connection' 내에 지정된 액터들의 마테리얼을 변경하면서 위쪽 버튼의 마테리얼도 변경하는 BP이다.

문 별로 설정된 "Duration Start" 와 "Duration Reverse" 의 시간이 지난 후에, 왼쪽 문의 x축 위치값은 -100만큼 이동하고 오른쪽 문의 x축 위치값은 100만큼 이동하게 할 수 있다.

위와 같이 문에 있는 "Box Collision" 으로 캐릭터와 충돌 발생 시 자동으로 열리고 닫히는 자동문을 만들어 줄 수 있다.

캐릭터가 처음에 들고 있는 Glow Stick은 비가시 상태였다가 장비를 습득했을 때 가시 상태로 바뀌어야 하기에, "Visibility" 를 꺼두는 것이다.

"Collision Sphere" 에 들어있는 아이템을 먹었을 때, 지정한 IBP가 있으면 습득해서 장비를 한다는 명령이다.

"Equipment State" 키 안의 Value를 위 사진과 같이 작성해줄 수 있다.

"Glow Stick" 이 "Equipment State" 안에 있는 키 중 하나일 경우, "Glow Stick" 을 가시화 상태로 만드는 BP이다.
"Point Light" 변수가 같이 있는 이유는 "Glow Stick" 에 발광효과를 주기 위해 "Point Light" 를 추가했기 때문에 "Glow Stick" 과 같이 넣어준 것이다.

위 BP는 아이템 습득 관련 키를 누르면 배치돼있는 아이템이 플레이어에가 날아오고 "Equipment State" 안에 있는 아이템일 경우 사라지면서 플레이어의 스태터스에 추가되게 하는 BP이다.
부모 클래스에서 "No Collision" 을 설정해줄 경우, 자식 클래스로 설정된 것들도 "No Collision" 으로 똑같이 설정이 변경된다.
*습득하는 아이템은 대부분의 경우 "No Collision" 으로 바꿔주는 것이 좋음

각 장비 별로 키를 부여하여 해당 장비를 보유 시, 바인딩된 키를 눌러 장비를 호출할 수 있게 한 것이다.

아이템 관련 카테고리 관리를 편하게 하기 위해 Emunator를 사용할 수 있다.

위에서 만든 Emunator를 사용하여 아이템을 습득하는 BP를 간단하게 만들 수 있고, 아이템을 습득했을 때 정상작동하는지 확인하기 위해 위 그림처럼 "Print String" 을 사용해서 테스트를 미리 해볼 수도 있다.
'Unreal Engine > GCC Class (5.5.4)' 카테고리의 다른 글
| Unreal Engine 5 배워보기 - 20일차 (2) | 2025.04.14 |
|---|---|
| Unreal Engine 5 배워보기 - 19일차 (0) | 2025.04.11 |
| Unreal Engine 5 배워보기 - 17일차 (0) | 2025.04.09 |
| Unreal Engine 5 배워보기 - 16일차 (0) | 2025.04.08 |
| Unreal Engine 5 배워보기 - 15일차 (0) | 2025.04.07 |