블루프린트에 노출되는 스케줄링 시스템인 쿼츠(Quartz) 는 게임, 오디오 로직 및 오디오 렌더링 스레드 간의 타이밍 문제를 해결하여 오디오를 샘플 단위로 정밀하게 재생할 수 있게 해줍니다.
이 가이드에서는 오디오 및 게임플레이 이벤트를 트리거하는 쿼츠 기반 메트로놈을 생성하는 방법을 살펴봅니다.
전제 조건
새로운 삼인칭(Third Person) 템플릿 프로젝트를 생성합니다.
1 - 메타사운드 생성
메트로놈 비프음을 위한 메타사운드 소스(MetaSound Source) 를 두 개 생성합니다. 위 그래프를 빌드하려면 아래 단계를 따릅니다.
1.1 - 고주파 비프음 생성
-
메타사운드 소스를 생성합니다.
-
콘텐츠 브라우저(Content Browser) 에서 추가(Add) 버튼을 클릭합니다.
-
오디오(Audio) > 메타사운드 소스 를 선택합니다.
-
새 메타사운드를
MSS_BeepA4로 명명합니다.
-
-
메타사운드를 더블클릭하여 메타사운드 에디터(MetaSound Editor) 를 엽니다.
-
On Play Input 노드를 찾아서 핀을 빈 공간으로 드래그합니다. 노드 검색에 'AD Envelope (Audio)'를 입력하여 연결된 노드를 생성합니다. 그래프에서 노드를 드래그하여 이동할 수 있습니다.
-
AD Envelope (Audio) 노드에서 다음을 수행합니다.
-
감쇠 시간(Decay Time) 을 0.1로 설정합니다.
-
완료 시(On Done) 핀을 On Finished Output 노드에 연결합니다.
-
Out 엔벨로프(Out Envelope) 핀에서 드래그하여 Multiply (Audio) 노드를 생성합니다.
-
-
Multiply (Audio) 노드에서 다음을 수행합니다.
-
하단의 피승수 핀에서 드래그하여 Sine 노드를 생성합니다.
-
출력 핀을 Out Mono Output 노드에 연결합니다.
-
-
메타사운드 에디터 툴바 에서 재생(Play) 버튼을 클릭하여 짧은 고주파 비프음을 재생합니다.
-
메타사운드를 저장하고 메타사운드 에디터 를 닫습니다.
1.2 - 저주파 비프음 생성
-
콘텐츠 브라우저 에서
MSS_BeepA4메타사운드를 우클릭하고 복제(Duplicate) 를 선택합니다. -
새 메타사운드를
MSS_BeepA3로 명명합니다. -
메타사운드를 더블클릭하여 메타사운드 에디터 를 엽니다.
-
Sine 노드에서 주파수(Frequency) 를 220으로 설정합니다.
-
메타사운드 에디터 툴바 에서 재생 버튼을 클릭하여 짧은 저주파 비프음을 재생합니다.
-
메타사운드를 저장하고 메타사운드 에디터 를 닫습니다.
2 - 레벨 블루프린트 빌드
레벨 블루프린트를 생성하여 메트로놈을 위한 쿼츠 클럭, 사운드 및 이벤트 델리게이트를 생성합니다.
2.1 - 쿼츠 클럭 생성
-
레벨 에디터(Level Editor) 툴바에서 블루프린트(Blueprint) 버튼을 클릭하고 레벨 블루프린트 열기(Open Level Blueprint) 를 선택합니다.
-
빈 공간에서 우클릭하고 Get QuartzSubsystem 노드를 추가합니다.
-
Get QuartzSubsystem 노드의 출력 핀에서 드래그하여 Create New Clock 노드를 추가합니다.
-
Create New Clock 노드에서 다음을 수행합니다.
-
실행 입력(Exec Input)(>) 핀을 Event BeginPlay 노드에 연결합니다.
-
클럭 이름(Clock Name) 을
LevelClock으로 설정합니다. -
In 세팅(In Settings) 핀에서 드래그하여 쿼츠 클럭 세팅 만들기(Make QuartzClockSettings) 핀을 추가합니다.
-
반환 값(Return Value) 핀에서 드래그하여 변수로 승격(Promote to Variable) 을 선택합니다. 그러면 Set 노드와
NewVar라는 이름의 블루프린트 변수가 생성됩니다. 이 변수는 쿼츠 클럭 핸들을 저장하며 가비지 컬렉션을 방지합니다. -
실행 출력(Exec Output)(>) 핀을 Set (NewVar) 노드에 연결합니다.
-
-
내 블루프린트(My Blueprint) 패널에서 NewVar 변수를 우클릭하고 이름변경(Rename) 을 선택합니다.
-
변수를
ClockHandle로 명명합니다. -
Make QuartzClockSettings 노드의 타임 시그니처(Time Signature) 에서 드래그하여 Make QuartzTimeSignature 노드를 생성합니다.
-
Set (Clock Handle) 노드에서 다음을 수행합니다.
-
출력 핀에서 드래그하여 Set Beats Per Minute 노드를 생성합니다.
-
실행 출력(>) 핀을 Set Beats Per Minute 노드에 연결합니다.
-
-
Set Beats Per Minute 노드에서 분당 비트(Beats Per Minute) 를 100.0으로 설정합니다.
2.2 - 사운드 생성
-
Set Beats Per Minute 노드(이전 섹션의 끝)의 실행 출력(>) 핀에서 드래그하여 Create Sound 2D 노드를 생성합니다.
-
Create Sound 2D 노드에서 다음을 수행합니다.
-
사운드(Sound) 를
MSS_BeepA4로 설정합니다. -
반환 값 핀에서 드래그하여 변수로 승격 을 선택합니다. 그러면 Set 노드와
NewVar라는 이름의 또 다른 블루프린트 변수가 생성됩니다. -
오디오 컴포넌트 출력(Audio Component Output) 핀에서 드래그하여 Set Play Multiple Instances 노드를 생성합니다.
-
실행 출력(>) 핀을 Set Play Multiple Instances 노드에 연결합니다.
-
-
내 블루프린트 패널에서 NewVar 변수를 우클릭하고 이름변경 을 선택합니다.
-
변수를
BeepA4로 명명합니다. -
Set Play Multiple Instances 노드에서 다음을 수행합니다.
-
다수의 인스턴스 재생(Play Multiple Instances) 을 활성화합니다.
-
실행 출력(>) 핀에서 드래그하여 Create Sound 2D 노드를 하나 더 생성합니다.
-
-
두 번째 Create Sound 2D 노드에서 다음을 수행합니다.
-
사운드 를
MSS_BeepA3으로 설정합니다. -
반환 값 핀에서 드래그하여 변수로 승격 을 선택합니다. 그러면 Set 노드와
NewVar라는 이름의 또 다른 블루프린트 변수가 생성됩니다. -
오디오 컴포넌트 출력 핀에서 드래그하여 Set Play Multiple Instances 노드를 하나 더 생성합니다.
-
실행 출력(>) 핀을 Set Play Multiple Instances 노드에 연결합니다.
-
-
내 블루프린트 패널에서 NewVar 변수를 우클릭하고 이름변경 을 선택합니다.
-
변수를
BeepA3로 명명합니다. -
두 번째 Set Play Multiple Instances 노드에서 다음을 수행합니다.
- 다수의 인스턴스 재생 을 활성화합니다.
2.3 - 쿼츠 클럭 시작
-
빈 공간에서 우클릭하고 Get Clock Handle 노드를 추가합니다.
-
Get Clock Handle 노드의 출력 핀에서 드래그하여 Start Clock 노드를 생성합니다.
-
Start Clock 노드에서 다음을 수행합니다.
-
실행 입력(>) 핀을 두 번째 Set Play Multiple Instances 노드(이전 섹션의 끝)에 연결합니다.
-
Clock Handle 노드에서 드래그하여 Subscribe to All Quantization Events 노드를 생성합니다.
-
실행 출력(>) 핀을 Subscribe to All Quantization Events 노드에 연결합니다.
-
-
Subscribe to All Quantization Events 노드의 양자화 이벤트 시(On Quantization Event) 핀에서 드래그하여 Create Event 노드를 생성합니다.
-
Create Event 노드에서 다음을 수행합니다.
-
드롭다운을 클릭하고 [일치하는 이벤트 생성(Create a matching event)] 을 선택합니다. 이렇게 하면 새 Custom Event 노드가 생성됩니다.
-
Custom Event 를
OnQuantizationEvent로 명명합니다.
-
2.4 - 이벤트 델리게이트 생성
-
OnQuantizationEvent 노드에서 다음을 수행합니다.
-
양자화 타입(Quantization Type) 핀에서 드래그하여 Switch on EQuartzCommandQuantization 노드를 생성합니다.
-
실행 출력(>) 핀을 Switch on EQuartzCommandQuantization 노드에 연결합니다.
-
양자화 타입 핀에서 드래그하여 Make QuartzQuantizationBoundary 노드를 생성합니다.
-
'양자화 타입' 핀에서 드래그하여 Make QuartzQuantizationBoundary 노드를 하나 더 생성합니다.
-
-
두 Make QuartzQuantizationBoundary 노드에서 카운팅 레퍼런스 포인트(Counting Reference Point) 를 '전송 상대(Transport Relative)'로 설정합니다.
-
Switch on EQuartzCommandQuantization 노드에서 다음을 수행합니다.
-
바(Bar) 핀에서 드래그하여 Play Quantized 노드를 생성합니다.
-
비트(Beat) 핀에서 드래그하여 Play Quantized 노드를 하나 더 생성합니다.
-
-
첫 번째 Play Quantized 노드에서 다음을 수행합니다.
-
타깃(Target) 핀에서 드래그하여 Get Beep A4 노드를 생성합니다.
-
In 클럭 핸들(In Clock Handle) 핀에서 드래그하여 Get Clock Handle 노드를 생성합니다.
-
In 양자화 바운더리(In Quantization Boundary) 핀을 Make QuartzQuantizationBoundary 노드 중 하나의 출력 핀에 연결합니다.
-
-
두 번째 Play Quantized 노드에서 다음을 수행합니다.
-
타깃 핀에서 드래그하여 Get Beep A3 노드를 생성합니다.
-
In 클럭 핸들 핀에서 드래그하여 Get Clock Handle 노드를 생성합니다.
-
In 양자화 바운더리 핀을 연결되지 않은 Make QuartzQuantizationBoundary 노드의 출력 핀에 연결합니다.
-
-
블루프린트를 컴파일하고 저장합니다.
-
블루프린트 에디터(Blueprint Editor) 를 닫습니다.
2.5 - 레벨 테스트
레벨 에디터 툴바 에서 재생 버튼을 클릭합니다. 메타사운드는 비트마다 저주파 비프음, 바마다 고주파 비프음을 재생합니다.
3 - 블루프린트 액터 빌드
레벨 블루프린트에서 구성한 쿼츠 클럭의 비트에 맞춰 스케일이 조절되는 큐브 컴포넌트가 있는 블루프린트 액터를 생성합니다.
3.1 - 블루프린트 액터 생성
-
콘텐츠 브라우저 에서 추가 버튼을 클릭합니다.
-
블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 액터(Actor) 를 선택합니다.
-
새 블루프린트 액터를
BP_QuartzCube로 명명합니다. -
블루프린트 액터를 더블클릭하여 블루프린트 에디터 를 엽니다.
-
컴포넌트(Components) 패널에서 추가 버튼을 클릭하고 검색창에 'Cube'를 입력한 다음 Enter를 누릅니다.
3.2 - 액터의 이벤트 그래프에서 레벨 클럭 구하기
-
빈 공간에서 우클릭하고 Get QuartzSubsystem 노드를 추가합니다.
-
Get QuartzSubsystem 노드의 출력 핀에서 드래그하여 Get Handle for Clock 노드를 추가합니다.
-
Get Handle for Clock 노드에서 다음을 수행합니다.
-
실행 입력(>) 핀을 Event BeginPlay 노드에 연결합니다.
-
클럭 이름 을
LevelClock으로 설정합니다. -
반환 값 핀에서 드래그하여 Subscribe to Quantization Event 노드를 생성합니다.
-
실행 출력(>) 핀을 Subscribe to Quantization Event 노드에 연결합니다.
-
-
Subscribe to Quantization Event 노드에서 다음을 수행합니다.
-
In 양자화 이벤트(In Quantization Event) 를 '비트(Beat)'로 설정합니다.
-
반환 값 핀에서 드래그하여 변수로 승격 을 선택합니다. 그러면 Set 노드와
Clock Handle이라는 이름의 블루프린트 변수가 생성됩니다. 이 변수는 쿼츠 클럭 핸들을 저장하며 가비지 컬렉션을 방지합니다. -
실행 출력(>) 핀을 Set (Clock Handle) 노드에 연결합니다.
-
양자화 이벤트 시 핀에서 드래그하여 Create Event 노드를 생성합니다.
-
-
Create Event 노드에서 다음을 수행합니다.
-
드롭다운을 클릭하고 [일치하는 이벤트 생성] 을 선택합니다. 이렇게 하면 새 Custom Event 노드가 생성됩니다.
-
Custom Event 를
OnBeat로 명명합니다.
-
3.3 - 비트 시 액터 스케일 조절
-
OnBeat 노드에서 다음을 수행합니다.
-
실행 출력(>) 핀에서 드래그하여 Set Actor Scale 3D 노드를 생성합니다.
-
비트 핀을 Set Actor Scale 3D 노드의 새 스케일 3D(New Scale 3D) 핀에 연결합니다. 그러면 자동으로 To Vector (Integer) 노드가 생성됩니다.
-
-
블루프린트를 컴파일하고 저장합니다.
-
블루프린트 에디터 를 닫습니다.
4 - 레벨 블루프린트 수정
레벨 블루프린트에 로직을 추가하여 BP_QuartzCube 를 스폰합니다.
-
레벨 에디터 툴바에서 블루프린트 버튼을 클릭하고 레벨 블루프린트 열기 를 선택합니다.
-
Subscribe to All Quantization Events 노드(섹션 2.3)의 실행 출력(>) 핀에서 드래그하여 Spawn Actor from Class 노드를 생성합니다.
-
Spawn Actor 노드에서 다음을 수행합니다.
-
클래스(Class) 를
BP_QuartzCube로 설정합니다. -
스폰 트랜스폼(Spawn Transform) 핀에서 드래그하여 변수로 승격 을 선택합니다.
-
-
블루프린트를 컴파일합니다.
-
Spawn Transform 노드를 선택합니다.
-
디테일(Details) 패널에서 디폴트 값(Default Value) > 스폰 트랜스폼 > 위치(Location) 를 1600.0, 1200.0, 200.0으로 설정합니다.
-
블루프린트를 컴파일하고 저장합니다.
-
블루프린트 에디터 를 닫습니다.
5 - 레벨 테스트
레벨 에디터 툴바 에서 재생 버튼을 클릭합니다. 이제 BP_QuartzCube 가 레벨에서 스폰되며, 메트로놈 비트에 따라 스케일이 조절됩니다.