1. 개요
프로젝트에서 게임 설정 관련된 작업을 시작하게 되었습니다. 가장 먼저 구현하고 싶었던 기능은 사운드 조절이었습니다. 이를 위해 언리얼 엔진의 사운드 시스템을 간단히 조사해보았고, 특히 Sound Class, Sound Mix, 그리고 이를 제어할 수 있는 C++ 함수들에 대해 처음으로 다뤄보게 되었습니다.
2. Sound Class
Sound Class는 사운드를 논리적인 그룹으로 나누어 제어할 수 있게 해주는 시스템입니다. 예를 들어, 배경음(BGM), 효과음(SFX), 음성(Voice)을 각각의 사운드 클래스에 할당해두면, 이들 그룹의 볼륨을 개별적으로 제어할 수 있습니다.
- SC_BGM → 배경음용 Sound Class
- SC_SFX → 효과음용 Sound Class
- SC_UI → UI 효과음 전용 Sound Class
- SC_Master → 위 Sound Class를 Child Class로 둔 전체 마스터 볼륨 설정용 클래스
🔧 에디터에서의 설정 방법:
- Content Browser에서 우클릭 → Sounds → Sound Class 생성
- 생성한 Sound Class의 속성에서 Parent Class를 설정하거나 계층 구조를 구성 가능
- 사운드 에셋(Sound Cue 등)에서 해당 Sound Class를 지정
이렇게 분리해두면 C++이나 Blueprint에서 각 그룹의 볼륨을 따로 조절할 수 있습니다.
3. Sound Mix
Sound Mix는 Sound Class에 정의된 속성(예: 볼륨, 피치 등)을 일시적으로 덮어쓰기 할 수 있도록 도와주는 시스템입니다. 예를 들어 UI를 열었을 때 배경음을 살짝 줄이거나, 특정 이벤트 발생 시 효과음을 강조하는 식의 연출이 가능합니다.
🔸 주로 사용되는 예시:
- UI 열릴 때 BGM은 30%로 줄이고, 효과음은 그대로 유지
- 일시정지 시 모든 사운드 볼륨 감소
- 전투 진입 시 효과음 강조
사운드 믹스는 사운드 클래스의 볼륨을 즉시 바꾸는 것이 아니라, 오버라이드 형태로 부드럽게 변화시킬 수 있어 매우 유용합니다.
4. C++로 SoundMix 제어하기
이번에 새롭게 알게 된 부분은 사운드 믹스를 코드로도 동적으로 제어할 수 있다는 점이었습니다. UGameplayStatics에서 제공하는 몇 가지 함수를 통해 이를 처리할 수 있습니다.
🔹 1) UGameplayStatics::PushSoundMixModifier(UObject* WorldContextObject, USoundMix* InSoundMix)
- 기능: SoundMix를 활성화합니다.
- 효과: 해당 믹스에 정의된 Sound Class의 오버라이드가 적용됨
- 예시:
-
cpp
UGameplayStatics::PushSoundMixModifier(GetWorld(), MySoundMix);
🔹 2) UGameplayStatics::PopSoundMixModifier(UObject* WorldContextObject, USoundMix* InSoundMix)
- 기능: 적용 중인 SoundMix를 해제합니다.
- 효과: 해당 믹스에서 설정한 오버라이드가 사라지고 원래 설정으로 복귀
- 예시:
-
cpp
UGameplayStatics::PopSoundMixModifier(GetWorld(), MySoundMix);
🔹 3) UGameplayStatics::SetSoundMixClassOverride(...)
UGameplayStatics::SetSoundMixClassOverride(
GetWorld(), // 월드 컨텍스트
MySoundMix, // 적용할 SoundMix
MySoundClass, // 대상 SoundClass
0.2f, // 볼륨 (0.0 ~ 1.0)
1.0f, // 피치 (기본값 1.0)
0.5f // 페이드 시간 (초 단위)
);
- 기능: 특정 SoundMix 내에서 특정 SoundClass의 속성을 오버라이드
- 장점: 에디터에서 설정한 SoundMix를 수정하지 않고도 런타임에 유연한 조절 가능
- 사용 예시: UI가 열릴 때 BGM SoundClass만 볼륨을 0.2로 변경
5. 마무리
- 처음 써보니 사운드 시스템이 꽤 강력하고 유연하다는 점
- 다음엔 SoundConcurrency나 Audio Volume도 함께 공부하고 싶다는 마무리
'TIL > Unreal Engine' 카테고리의 다른 글
언리얼 엔진 퍼포먼스 최적화의 첫걸음 (0) | 2025.07.15 |
---|---|
언리얼 엔진의 입력 모드(FInputMode) (0) | 2025.05.21 |
언리얼 엔진 레벨 전환 시 로딩 방식 (0) | 2025.05.14 |
언리얼 엔진의 맵 로딩 (0) | 2025.05.08 |
AI ROV(Reciprocal Velocity Obstacles) (0) | 2025.04.24 |