컴퓨터 및 게임 관련 전공인이 아닌 문외한 일반인이 언리얼 엔진을 배우면서 정리한 내용입니다.
그날그날 배웠던 내용을 제가 나중에 보기 위해 정리한 것으로, 지금 당장 보기에 부족한 점이 아주아주 많고 추후에 수정이 될 수도 있습니다.
오탈자 및 잘못 기재된 내용 지적, 부족한 내용 설명은 언제든지 환영입니다.
본글은 언리얼 엔진 5.5.4 버전 영문판을 기준으로 합니다.
----------------------------------------------------------------------------------------------------------------
41일차 학습 내용
- MetaSound
Mixer
Random Play
폭발 소리 제작
Trigger Repeat
Trigger Sequence
Trigger Delay
바람 소리
자동차 엔진 소리 (소리 잘라서 사용)
- Constraint
Physics Constraint
Projection Linear Tolerance / Projection Angular Tolerance
Linear Limits / Angular Limits
Linear Motor / Angular Motor
Cable
Breakable
Spring
Door
Slerp
Thruster
MetaSound

Contents Drawer에서 우클릭을 한 뒤 "Audio" 탭에서 "MetaSound Source" 를 눌러 "MetaSound" 를 생성할 수 있다.

MetaSound를 실행하면 위 그림과 같이 BP와 비슷한 창이 뜨는데, 여기에서 소리에 관련된 설정을 해줄 수 있다.

기본적으로는 Mono로 설정되어있고 위 그림과 같이 Mono 형식의 "Wave Player" 노드를 배치하고 연결해줌으로써 소리 재생이 가능하다.

Mono 형식이 아닌 Stereo 형식으로 설정해서 소리에 입체감을 주고 싶을 경우, 우선 "Output Format" 에서 'Stereo' 로 변경해줘야한다.

그리고 Stereo 형식 의 "Wave Player" 노드를 생성 후, 각각 왼쪽, 오른쪽에서 소리가 나도록 연결해주면 된다.
입체감을 위해 대부분의 게임의 경우 Stero 형식을 사용하지만, 지금 수업에서 사용하는 음원으로는 입체감을 느끼기 힘들기에, 아래 예시에서는 Mono 형식으로만 사용할 것이다.

레벨에 "Meta Sound" 를 배치하면 항상 자동으로 소리가 재생되는데, 원치 않을 경우에는 "Auto Activate" 를 체크해제해주면 된다.
Mixer
Mixer는 2가지 이상의 소리를 동시에 섞어서 재생할 때 사용하는 노드이다.

위 그림같이 노드를 연결해줄 경우 각각의 Mono Player에서 설정한 음원들이 동시에 섞어져서 재생이 된다.

위 그림과 같이 float 형식의 변수를 생성해서 'Pitch Shift' 에 연결해줄 경우, float에서 설정해준 값만큼 Pitch가 적용돼 소리가 변하게 된다.
Random Play
이번엔 여러 음원들 중 하나의 음원만 무작위로 선출하 재생하는 기능을 만들어보도록 하겠다.

우선 위 그림과 같이 "Wave Player" 노드를 생성해주고, 'Wave Asset' 을 변수로 승격시켜준다.

승격시킨 변수에서 "Is Array" 를 눌러 배열로 만들어주고, 넣고 싶은 음원의 수만큼 배열을 생성해주고 음원을 추가해준다.

그리고 위 그림과 같이 "Random Get" 노드에 위에서 생성한 음원이 담긴 배열을 연결해주고, 그 다음 "Wave Player" 노드를 연결해주면 음원이 무작위로 하나 골라서 재생되게 된다.

여기서 위 그림과 같이 "Random Float" 노드를 "Wave Player" 노드에 연결해주고 'Min' 과 'Max' 값을 설정해주면, 해당 범위 안에서 무작위로 설정된 수치만큼 Pitch 값이 적용되게 된 상태로 무작위의 음원이 나오게 된다.
폭발 소리 제작
위에서 학습한 것을 바탕으로 폭발 소리를 만들어보도록 하겠다.
우선은 폭탄 액터 BP와 폭발 소리 MSS를 생성해준다.

폭발 소리 MSS에 들어가서 위 그림과 같이 노드들을 연결해준다.
위에 있는 "Wave Player" 노드에는 도화선이 타는 것 같은 소리를 넣어주었고, 아래의 "Wave Player" 노드에는 여러 폭발음을 넣어서 무작위로 하나가 재생되도록 설정해주었다.
완전히 작성된 것이 아니기에 재생해보면 도화선이 타는 소리 밖에 나지 않는다.
폭발 소리는 폭탄이 터지는 타이밍에 나와야하기에, 아래에서 폭탄이 터지는 타이밍을 전달받으면 된다.

이번엔 위에서 생성한 폭탄 액터 BP에 가서 위 그림과 같이 BP를 작성해준다.
게임이 시작되면 'Sphere' Mesh에서 위에서 생성해준 폭발 소리 MetaSound가 재생되고, 'Sphere' Mesh를 둘러싸고 있는 Sphere Collision에 플레이어가 들어가면 해당 폭탄 액터를 파괴시키는 BP이다.
그리고 폭탄 액터가 파괴되면 폭발 소리 MetaSound에 Trigger 이벤트를 준다.

폭발 소리 MetaSound로 다시 돌아가서 'Inputs' 에서 새 변수를 생성해주고, 형식을 'Trigger' 로 해준다.
'Trigger' 는 BP에서 따로 명령을 해줘야 실행되는 방식이다.
그리고 "Execute Trigger Parameter" 노드에서 입력한 이름 대로 변수 이름을 설정해준다.

마지막으로 위 그림과 같이 노드를 마저 연결해준다.
그러면 평상 시에는 도화선이 타는 소리가 나다가, 폭탄 근처에 플레이어가 다가가면 폭탄이 터지며 폭탄 액터가 사라지고, 폭탄 액터가 사라지는 순간 폭탄이 터지는 소리가 무작위로 하나 재생되며, 재생이 끝나면 모든 소리의 재생이 종료된다.
*MetaSound 사용 시에는 위 그림에 있는 "Spawn Sound Attached" 노드나 "Create Sound 2D" 노드를 사용하는 것이 좋음;
"Play Sound 2D" 노드에서도 재생이 가능하지만, 되도록이면 위 노드를 사용하는 것을 추천

Trigger Repeat
"Trigger Repeat" 노드는 지정한 시간마다 배열 내 사운드 중 무작위 선출하여 반복 재생해주는 역할을 한다.

위 그림과 같이 노드들을 연결해주면 'In Array' 에 있는 음원들 중 무작위로 하나를 골라 계속 재생해주게 된다.

위 그림과 같이 "BPM To Seconds" 노드를 "Trigger Repeat" 노드에 연결해주면, 설정한 BPM 대로 소리 재생시켜주게 된다.
위 그림 같은 경우는 BPM 90의 주기로 소리가 재생되게 된다.
Trigger Sequence
"Trigger Sequence" 노드는 순차적으로 소리 재생해주는 역할을 한다.

위 그림과 같이 노드들을 연결해주면, BPM 90의 주기로 'Out0' 에 연결된 음원부터 'Out3' 에 연결된 음원까지 순차적으로 무한 반복 재생되게 된다.
Trigger Delay
"Trigger Delay" 는 입력된 시간 후에 이어서 소리를 재생하게 하는 역할을 한다.

위 그림과 같이 노드들을 연결해주면, BPM 240 ('120' 2배로 적용) 의 주기로 위에 있는 "Wave Player" 노드에 삽입된 음원이 재생되고, 해당 음원이 재생된 뒤 BPM 120의 시간 뒤에 아래에 있는 "Wave Player" 노드에 삽입된 음원이 재생되고, 이 과정이 무한 반복된다.
바람소리
이번에는 기본적으로 바람소리가 작게 나고, 플레이어가 이동하면 플레이어의 이동속도에 따라 바람 소리를 다르게 내도록 제작해보도록 하겠다.
우선은 폭탄 소리를 낼 때 했던 것처럼, 바람 소리를 재생할 액터 BP와 바람 소리 MetaSound를 생성해준다.

바람 소리 MetaSound에 들어가서 위 그림과 같이 노드들을 연결해준다.
"Noise" 노드를 생성하면 오른쪽에 자동으로 "One-Pole High Pass Filter" 노드가 같이 생성되는데, 전혀 상관없는 "Noise" 노드를 사용한 이유는 바람 소리와 비슷하게 나기에 사용하였다.
그리고 'Input' 에 새로운 변수를 float 형식으로 생성해주면 볼륨을 조절하는 것 같이 생긴 노드를 생성할 수 있고, 해당 노드를 'Gain' 에 연결해준다.
'Gain' 에 연결해주면 소리의 크기가 변하게 된다.


위 그림과 같이 볼륨을 조절하는 것 같이 생긴 노드의 "Widget" 에서 Widget의 형식을 변경해줄 수도 있다.

그리고 바람 소리를 재생할 액터 BP로 들어가 위 그림과 같이 BP를 작성해주고, "Execute Trigger Parameter" 노드에 'Input' 에 생성해준 float 변수의 이름을 넣어준다.
매 틱마다 플레이어의 속도를 바람 소리 MetaSound의 'Gain' 에 전달해줘서, 플레이어의 속도에 비례해 소리가 커지는 작업을 하게하는 것이다.

위에서 제작한 액터 BP를 레벨 상에 배치해주고 게임을 실행해보면 위에서 생성한 바람 소리 MetaSound가 아주 작게 재생되고, 플레이어가 이동하면 바람 소리가 커지게 된다.
자동차 엔진 소리 (소리 잘라서 사용)
자동차 시동을 거는 소리가 난 뒤 자동차 주행 엔진 소리가 나는 음원 파일 하나로, 자동차에 시동을 걸 때에는 시동 거는 소리만 나고 그 후로 주행 엔진 소리만 나게 할 수 있다.
우선 자동차 소리를 재생할 MetaSound 파일을 생성해준다.

생성한 MetaSound 파일을 실행해서 위 그림과 같이 노드를 이어준다.
바람 소리에서 했던 것과 마찬가지로 'Input' 에 새로운 변수를 float 형식으로 생성해준다.
위에 있는 "Wave Player" 노드와 아래에 있는 "Wave Player" 노드에는 같은 음원 파일이 들어가있고, 아래의 "Wave Player" 노드에는 주행 엔진 소리만 나도록 하기 위해 주행 엔진 소리가 재생되는 5~15초 구간만 반복해서 재생되도록 해주었다.
"Cross Fade" 노드와 같은 경우는 "Map Range Float" 노드와 연계하여 사용할 수 있는데, "Map Range Float" 노드에서 0~1 값을 설정해주면 "Cross Fade" 에 연결된 숫자 (0, 1) 에 가까운 값에 맞춰 재생 비율이 커진다.
즉, "Map Range Float" 노드가 '0' 의 값에 가까워질수록 "Map Range Float" 노드에서 '0' 값에 연결된 소리의 재생 비중이 늘어나고, '1' 의 값에 가까워질수록 '1'의 값에 연결된 소리의 재생 비중이 늘어난다.
그리고 자동차에 소리를 추가해줄 것이기에, 언리얼 엔진에서 기본적으로 제공하는 "Vehicle" 형식의 게임 툴의 자동차 BP에 들어가준다.

자동차 BP에 들어가 위 그림과 같이 "Event Begin Play" 노드 뒤에 노드를 추가로 연결해준다.
위에서 생성한 자동차 소리 MetaSound를 재생하며, 해당 MetaSound를 변수로 승격시켜준 것이다.

위 그림과 같이 새 함수를 생성해준다.
자동차의 속력과 관계있는 바퀴의 회전수를 float 형식으로 변환하여 자동차 소리 MetaSound에 전달해주기 위함이다.

그리고 위에서 생성한 함수를 Tick 노드 뒤에 연결해서 매 틱마다 자동차의 속력을 감지할 수 있도록 해준다.

다시 자동차 소리 MetaSound로 돌아가 위 그림과 같이 추가로 노드를 연결해준다.
이렇게 해주면 처음에는 자동차 시동을 거는 소리가 출력되고, 주행 중에는 자동차가 속력을 내므로 시동 거는 소리는 출력되지 않고 반복 처리해준 자동차 주행 엔진 소리만 출력이 되며, 속력에 비례해 엔진 소리의 볼륨을 키워줄 수 있다.
*가끔씩 소리 때문에 Crash가 나는 경우가 있는데, 이 경우에는 아래 사진과 같이 cmd 창 옆에 "stat audio" 를 입력해서 소리와 관련된 설정 창을 확인할 수 있음


Constraint
"Constaint" 는 두 오브젝트 사이를 연결해주는 줄 같은 것인데, 이를 이용해 언리얼 엔진에서 몇 가지 물리법칙 실험을 할 수도 있고 이를 활용해볼 수도 있다.
Physics Constraint

액터 BP를 생성하고 위 그림과 같이 좌측 상단의 "Add" 에 "Constraint" 를 검색해주면 "Physics Constraint" 를 생성해줄 수 있다.

그리고 "Component Name" 에 움직이게 하지 않을 기준을 "Name 1" 에 적어주고, 움직이게 할 오브젝트를 "Name 2" 에 적어주면 된다.
중요한 점은 "Name 2" 에 적어준 움직이게 할 오브젝트는 반드시 "Simulate Physics" 기능을 켜줘야 움직인다는 점이다.
위 그림과 같이 "Name" 을 적어줄 경우, 정육면체를 기준으로 하여 아래의 구가 진자 형태로 움직이게 된다.

그러면 위 그림과 같이 파란색 선으로 두 오브젝트 사이가 연결된 것을 확인할 수 있다.

레벨에 배치하고 플레이어로 구체를 밀어보면, 액터 BP 위에 있는 기준인 오브젝트는 가만히 있고 아래에 연결돼있는 오브젝트만 줄에 매달린 진자처럼 움직이는 것을 확인할 수 있다.
Projection Linear Tolerance / Projection Angular Tolerance
"Tolerance" 는 물리법칙을 받는 아래의 오브젝트의 이동 거리나 회전 각도를 보정해주는 기능이다.

"Tolerance" 의 수치가 커지면 보정의 범위가 커져서 물체가 좀 더 흔들리게 되고, "Tolerance" 의 수치가 작으면 보정의 범위가 줄어들어 물체가 덜 흔들리게 된다.
Linear Limits / Angular Limits
"Linear Limits" 혹은 "Angular Limits" 설정을 통해 움직이는 오브젝트의 이동 거리 제한이나 회전 각도 제한을 설정해 주는 기능이다.

아무것도 건들지 않은 기본적인 설정은 위 그림과 같다.
"Free" 로 설정해줄 경우 제약이 없는 것이고, "Limited" 는 사용자가 지정해준 범위 내에서만 이동 가능하도록 하며, "Locked" 는 완전히 움직이지 못하게 고정하는 것이다.
"Linear Limits" 에서의 축 값은 각각의 축 값을 가리키고, "Angular Limits" 같은 경우는 "Swing 1" , "Swing 2" , "Twist" 가 각각 z, y, x축을 가리킨다.

위 사진과 같이 "Linear Limits" 을 '100' 으로 설정해줄 경우, 물리 법칙의 적용을 받는 오브젝트에 외력을 가해줄 경우 고정된 오브젝트와 물리 법칙의 적용을 받는 오브젝트 사이의 직선 거리가 최대 '100' 까지만 늘어나도록 제한을 해주는 기능이다.

위 그림과 같이 외력이 가해질 경우, "Linear Limits" 는 고무줄과는 다르게 제자리로 돌아오지는 않고 약간 늘어나게만 해주는 것이다.

"Angular Limits" 을 설정해줄 경우, 위 그림과 같이 회전 각도에 제한을 주는 것을 확인할 수 있고, "Twist Limit" 을 통해 제한 수치를 지정해줄 수 있다.
Linear Motor / Angular Motor
"Linear Motor" 와 "Angular Motor" 는 물리 법칙을 받는 오브젝트를 제자리로 돌아오는 걸 도와주는 힘이다.

"Position Target" 에 좌표를 입력해주면 해당 좌표로 되돌아가도록 해주고, "Strength" 를 통해 지정된 좌표로 돌아가도록 탄성을 주는 것이다.
위 사진 같은 경우는 "Position Target" 에 (0, 0, 0) 값이 입력되어있는데, 이는 월드 좌표가 아닌 상대 좌표기에 제자리로 돌아오도록 해주는 것이다.

"Velocity Target" 에 있는 "Strength" 는 위에서 언급된 "Position Target" 의 "Strength" 와는 조금 다른데, "Velocity Target"의 "Strength" 는 제자리로 돌아갈 때의 이동 속도를 가리키는 것으로, 탄성과는 조금 다른 개념이다.

위 그림과 같이 "Angular Drive Mode" 를 "Twist and Swing" 으로 설정해줄 경우,"Twist" 와 "Swing" 에 Motor 효과를 줄 수 있게 된다.
그리고 "Position Target" 의 "Strength" 와 "Velocity Target" 의 "Strength" 는 "Linear Motor" 에서 언급된 정의와 똑같이, 각각 탄력과 제자리로 돌아가는 이동 속도를 가리킨다.
Cable
"Cable" 은 현실의 물리 법칙이 어느정도 적용이 되어있는 언리얼 엔진에서 구현한 줄이다.

"Cable" 을 생성하면 위 그림과 같이 이상한 곳에 이어져있는데, 그 이유는 "Cabe" 의 "End Location" 이 (100, 0, 0) 이라는 좌표에 연결되어있기 때문이다.
우리는 아래에 있는 구체에 "Cable" 을 연결해주고 싶기에, "End Location" 값을 (0, 0, 0) 으로 설정해주면 된다.

그러면 위 그림과 같이 구체에 "Cable" 이 연결되어있는 것을 확인할 수 있다.
"End Location" 의 밑에 있는 설정 중 "Cable Length" 는 단어 그대로 "Cable" 의 길이이고, "Num Segment" 는 줄을 설정해준 수치 만큼 쪼개서 수치가 클 경우에는 좀 더 부드러운 움직임을 내게 할 수 있다.
"Num Segment" 를 20으로 설정해줄 경우 줄을 20조각으로 나눠서, 각 조각조각 별로 따로 물리법칙을 줄 수 있기에 더 자연스러운 움직임을 낼 수 있지만, 그만큼 컴퓨터 자원 소모량이 늘어나 주의를 요한다.
"Cable Width" 는 단어 그대로 "Cable" 의 굵기를 설정할 수 있다.
Breakable
"Breakable" 은 입력해준 수치의 외력이 가해지면 "Physics Constraint" 를 끊어질 수 있게 하는 기능이다.

위 그림에 있는 "Linear Break Threshold" 값 조절을 통해 끊어지기 위한 외력의 정도를 조절해줄 수 있는데, 이 수치가 높아질수록 잘 안 끊어지게 된다.
Spring
위에서 배운 내용을 바탕으로 실제 Spring과 비슷하게 구현할 수가 있다.

위 그림과 같이 Cube 2개와 "Physics Constraint" 를 연결해준다.
"Physics Constraint" 추가했을 경우 항상 "Component Name" 을 설정해주는 것과 "Component Name" 1과 2에 어떤 것을 넣어야하는지 구분하는 것을 잊지 말아야한다.
움직이게 할 Cube에 "Simulate Physics" 를 설정하는 것도 잊지 않도록 한다.

Spring은 위 아래로만 길이를 변경시키며 움직이면 되기에, "Linear Limits" 은 z축만 변경 가능하도록 해주고, "Angular Limits" 은 모두 제한을 걸어주면 된다.

그리고 z축으로 적당히 탄성을 주면 되므로 "Angular Motor" 는 설정해줄 필요가 없고, "Linear Motor" 만 자연스럽게 움직이도록 설정해주면 된다.

Door
위에서 배운 내용을 바탕으로 미국 서부 영화에서 나오는 문을 비슷하게 구현할 수가 있다.

위 그림과 같이 Cylinder와 Cube, "Physics Constraint" 를 2개씩 배치해준다.
"Component Name" 을 구분하는 것과 "Simulate Physics" 체크하는 것은 어렵지 않으므로 이 과정부터는 생략하도록 하겠다.
문 같은 경우는 위 그림을 보면 z축 회전만 필요하기에 "Swing 1" 만 제한을 풀어주고 나머지는 제한을 걸어주면 된다.
그리고 문이 제자리로 돌아오도록 해주기 위해 "Angular Motor" 를 "Twist and Swing" 으로 바꿔주고, 위 그림과 같이 "Strength" 값을 적당히 넣어주면 된다.

문이 움직일 떄 오류가 발생하는데, 이는 서로의 Collision이 겹쳐서 충돌하기 때문이다.
이는 위 그림에서처럼 "Physics Constraint" 의 "Disable Collision" 을 체크함으로써 해결해줄 수 있다.

Slerp
"Slerp" 는 자주 쓰이지 않는데, 간단하게 말하면 자동으로 돌아가게 해주는 기능이다.

"Angular Motor" 의 "Slerp" 를 활성화하려면, 위 그림과 같이 "Angular Limit" 이 전부 "Free" 로 돼야 가능하다.

위 그림과 같이 "Slerp" 를 활성화하고 "Target Velocity" 의 원하는 축에 속도 값을 넣어주면, 아래 그림과 같이 해당 축의 값으로 계속 회전하는 것을 확인할 수 있다.

Thruster
"Thruster" 는 단어 그대로 무엇인가를 밀어주는 기능이다.

위 그림과 같이 "Add" 에 "Physics Thrusterer" 를 검색하여 추가해줄 수 있다.
"Physics Thrusterer" 는 "Physics Thrusterer" 의 x축으로 나아가는 힘을 주기 때문에, 오브젝트를 나아가게 하고자하는 방향의 반대 방향에 "Physics Thruster" 의 x축을 위치시켜야하고, 나아가게 하고자하는 오브젝트의 자식으로 들어가야한다.
위 그림과 같이 "Physics Thrusterer" 를 설정해주면 아래 그림과 같이 위로 날아가는 것을 확인할 수 있다.

*위에서 배운 내용을 응용하면 아래 그림과 같이 회전문과 시소도 제작이 가능


'Unreal Engine > GCC Class (5.5.4)' 카테고리의 다른 글
| Unreal Engine 5 배워보기 - 43일차 (0) | 2025.05.23 |
|---|---|
| Unreal Engine 5 배워보기 - 42일차 (1) | 2025.05.22 |
| Unreal Engine 5 배워보기 - 40일차 (1) | 2025.05.20 |
| Unreal Engine 5 배워보기 - 39일차 (2) | 2025.05.19 |
| Unreal Engine 5 배워보기 - 38일차 (0) | 2025.05.16 |