260515 TIL - UE 5.6과 리듬게임 프로젝트, 그리고 Wwise

2026. 5. 18. 08:58언리얼 7기 본캠프

 

최종 팀 프로젝트 장르가 리듬게임으로 결정되었고, UE에서 리듬게임을 만드는 방향성과 방법들에 대해서 스터디한 내용을 정리함

 

 

우리 팀 프로젝트는 단일 리듬게임이 아니라 여러 개의 리듬 미니게임을 하나의 흐름으로 묶는 캐주얼 리듬 미니게임 컬렉션임

기획 단계에서 정한 핵심은 미니게임마다 플레이 방식은 다르지만, 채보 데이터는 A / B / C / D 액션 이벤트 기반으로 통일한다는 점이었음

그래서 Wwise 적용도 단순히 BGM을 재생하고 효과음을 붙이는 문제가 아니라, 팀에서 정한 통합 채보 포맷과 미니게임별 액션 구조에 맞춰 오디오 레이어를 어떻게 분리할지가 중요했음


프로젝트 기준

최종 팀 프로젝트 기준은 다음과 같음

엔진 : Unreal Engine 5.6
플랫폼 : PC Windows
장르 : 리듬 게임 / 미니게임 컬렉션
레퍼런스 : 리듬세상, Bits & Bops
비주얼 방향 : 귀여운 로우폴리 스타일
메인 컬러 : 보라 / 노랑
핵심 구조 : A / B / C / D 기반 통합 채보 포맷

 

컨셉은 만능 알바생이 여러 아르바이트를 리듬에 맞춰 성공해나가는 방향임

미니게임 후보는 점프점프, 뒤뚱뒤뚱, 따라쟁이 동물, 주사위 굴리기, 물고기 낚시, 보스 잡기, 칸 칠하기 등이 있음

이 구조에서 중요한 건 각 미니게임이 완전히 따로 노는 게 아니라, 같은 채보 시스템 위에서 서로 다른 액션을 해석한다는 점임


Wwise 버전 확인

Unreal Engine 5.6에 Wwise를 붙이려면 Wwise Unreal Integration 버전부터 확인해야 함

현재 확인한 Wwise Unreal Integration 2025.1.4 기준으로 Unreal Engine 5.5, 5.6, 5.7을 지원한다고 되어 있음

따라서 최종 프로젝트의 엔진 버전인 UE 5.6과 Wwise 조합 자체는 사용할 수 있을 것으로 보임

이번 프로젝트에서 중요한 건 최신 기능을 무리하게 쓰는 게 아니라, 입력과 판정과 사운드 피드백이 안정적으로 맞는 구조를 만드는 것임


Wwise 적용 흐름

Wwise를 Unreal 프로젝트에 붙이는 흐름은 대략 이렇게 잡으면 될 것 같음

Audiokinetic Launcher에서 Unreal 프로젝트 선택
Integrate Wwise in Project 실행
Wwise 프로젝트 생성 또는 기존 Wwise 프로젝트 연결
Wwise에서 SoundBank 설정
Unreal Project Settings에서 WAAPI 연결과 GeneratedSoundBanks 경로 확인
Wwise에서 음악과 효과음 Import
Event 생성
Generate SoundBanks
Unreal Wwise Browser에서 Reconcile
생성된 Wwise UAsset을 Blueprint나 C++에서 사용

여기서 중요한 건 Wwise에서 Event를 만들었다고 바로 Unreal에서 안정적으로 쓸 수 있는 게 아니라는 점이었음

Wwise 쪽에서 Event와 SoundBank를 만들고, Unreal 쪽에서 Reconcile을 통해 UAsset 상태를 맞춰줘야 함

팀 작업에서는 이 부분이 특히 중요할 것 같음

사운드 담당자가 Wwise에서 Event를 추가했는데 SoundBank Generate나 Reconcile 과정이 빠지면, Unreal에서 해당 이벤트를 못 찾거나 이전 상태의 에셋을 계속 참조할 가능성이 있음

그래서 Wwise 작업 규칙은 팀 컨벤션으로 정해두는 게 좋아보임

Wwise Event 추가
SoundBank Generate
Unreal에서 Reconcile
변경된 Wwise 관련 파일과 UAsset 확인
커밋 전 팀원에게 변경 내용 공유

이 프로젝트에서 Wwise가 맡을 역할

Wwise는 판정 시스템이 아니라 오디오 연출과 피드백을 담당하는 레이어로 두는 게 맞아보임

Wwise가 맡을 역할

BGM 재생
미니게임별 효과음 재생
성공 / 실패 / 콤보 / 결과 사운드 처리
게임 상태에 따른 믹스 변화
박자 / 마디 / 마커 기준 콜백 전달

 

 

Unreal이 맡을 역할

채보 데이터 로드
현재 플레이 시간 계산
입력 처리
판정 처리
미니게임별 A / B / C / D 액션 실행
점수와 콤보 계산
UI와 결과 화면 처리

 

 

리듬게임에서 판정은 입력 시간과 채보 이벤트 시간을 비교해야 하므로, Unreal 쪽 JudgeComponent나 ChartSubsystem에서 일관되게 처리하는 게 좋아보임

Wwise는 그 결과를 받아서 소리와 믹스로 피드백을 주는 쪽이 맞음


통합 채보 포맷 기준 구조

우리 팀 기획의 핵심은 모든 미니게임이 같은 채보 포맷을 공유한다는 점임

각 미니게임마다 화면 구성이나 입력 방식은 달라도, 채보는 A / B / C / D 액션 이벤트로 통일됨

예를 들면 이런 식임

점프점프
A : 왼쪽 캐릭터 점프
B : 가운데 캐릭터 점프
C : 오른쪽 캐릭터 점프
D : 미배정

뒤뚱뒤뚱
A : 왼발 착지
B : 오른발 착지
C : 왼발 착지
D : 오른발 착지

따라쟁이 동물
A : 동작 1
B : 동작 2
C : 동작 3
D : 동작 4

주사위 굴리기
A : 왼쪽 이동
B : 위 이동
C : 오른쪽 이동
D : 아래 이동

이걸 코드 구조로 옮기면 채보 시스템은 액션 이벤트만 발생시키고, 각 미니게임은 그 액션을 자기 규칙에 맞게 해석하는 방식이 될 것 같음

ChartSubsystem
- 현재 시간에 맞는 Chart Event 발생

Minigame Actor
- A / B / C / D 이벤트 수신
- 미니게임별 액션으로 변환

JudgeComponent
- 입력 시간과 Chart Event 시간 비교
- Perfect / Good / Miss 판정

AudioSubsystem
- 판정 결과에 맞는 Wwise Event 재생

이렇게 하면 미니게임이 늘어나도 채보 로더와 판정 시스템을 매번 새로 만들 필요가 없음

새 미니게임은 A / B / C / D를 어떻게 해석할지만 구현하면 됨


Chart Data 구조 구상

채보 파일은 JSON 기반 .rhythmchart 포맷으로 저장하기로 되어 있음

초기 구조는 최대한 단순하게 잡는 게 좋아보임

{
  "songId": "jump_01",
  "bpm": 120,
  "offsetMs": 0,
  "minigame": "Jump",
  "events": [
    {
      "timeMs": 1000,
      "beat": 2,
      "action": "A",
      "cue": "Input",
      "extra": 0
    }
  ]
}

여기서 action은 A / B / C / D 중 하나가 되고, cue는 이벤트 성격을 구분하는 값으로 둘 수 있음

처음에는 Input만 있어도 되지만, 따라쟁이 동물 같은 미니게임은 Preview와 Input이 나뉘어야 할 가능성이 있음

Preview : 먼저 보여주는 동작이나 소리
Input   : 플레이어가 입력해야 하는 타이밍

extra 값은 미니게임별 추가 정보에 사용할 수 있을 것 같음

예를 들어 주사위 굴리기에서는 타일 크기나 이동 속도 배율을 넣을 수 있고, 보스 잡기에서는 공격 강도나 패턴 ID를 넣을 수 있음

처음부터 너무 복잡하게 만들기보다는 고정 BPM, offsetMs, A / B / C / D 이벤트부터 안정화하는 게 좋을 것 같음


시간 기준과 판정 구조

리듬게임에서 가장 조심해야 할 부분은 시간 기준임

Tick에서 DeltaTime을 누적해서 현재 시간을 만드는 방식은 간단하지만, 프레임 드랍이나 일시정지 상황에서 실제 음악과 어긋날 수 있음

CurrentSongTime += DeltaTime;

그래서 ChartSubsystem은 단순 Tick 누적만 믿지 않고, 곡 시작 시점과 보정값을 기준으로 현재 시간을 계산해야 함

현재 생각한 방향은 이쪽임

Wwise에서 BGM 재생
ChartSubsystem에서 곡 시작 기준 시간 저장
현재 플레이 시간 계산
Chart Event 시간과 현재 플레이 시간 비교
입력 발생 시 가장 가까운 이벤트 탐색
판정 결과를 AudioSubsystem과 UI로 전달

Wwise의 Music Sync Callback이나 Marker는 박자, 마디, 구간 전환 확인에 사용할 수 있을 것 같음

다만 모든 판정을 Wwise Callback에 의존하는 구조는 피하는 게 좋아보임

우리 프로젝트는 미니게임마다 액션 해석이 다르고, 따라쟁이 동물처럼 미리 보여준 뒤 한 박자 쉬고 입력하는 구조도 있기 때문에 판정 기준은 Unreal 쪽에서 일관되게 관리하는 편이 안전해보임


판정 레이턴시 보정

기획서 설정 화면에 판정 레이턴시 ±100ms와 보정 게임이 들어가 있음

이건 단순 옵션이 아니라 리듬게임의 핵심 기능으로 봐야 할 것 같음

PC 환경에서도 키보드, 모니터, 스피커, 이어폰, 블루투스 장비에 따라 입력감과 청각 싱크가 달라질 수 있음

따라서 판정식에는 처음부터 보정값을 넣어야 함

JudgedDeltaMs = InputTimeMs - TargetTimeMs - UserLatencyOffsetMs - ChartOffsetMs

TargetTimeMs는 채보 이벤트 시간이고, InputTimeMs는 플레이어 입력이 들어온 시점의 플레이 시간임

UserLatencyOffsetMs는 설정에서 사용자가 조정한 값이고, ChartOffsetMs는 곡이나 채보 자체의 보정값으로 볼 수 있음

초기 판정 범위는 임시로 이렇게 둘 수 있을 것 같음

Perfect : ±30ms
Good    : ±70ms
Miss    : 그 외

이 수치는 확정값이 아니라 테스트하면서 조정해야 함

특히 미니게임마다 체감 난이도가 다를 수 있어서, 공통 판정 범위와 미니게임별 보정값을 나눌지 고민이 필요해보임


미니게임별 Wwise 적용 구상

점프점프

점프점프는 세 캐릭터가 각자 다른 속도로 제자리 점프를 반복하고, 땅에 닿는 타이밍에 키를 누르는 미니게임임

채보 이벤트는 캐릭터 착지 타이밍으로 보면 될 것 같음

A : 왼쪽 캐릭터 착지
B : 가운데 캐릭터 착지
C : 오른쪽 캐릭터 착지

Wwise는 성공 착지음, 실패음, 캐릭터별 작은 점프음을 나눠서 쓸 수 있음

중요한 건 착지 사운드가 입력 피드백을 방해하지 않게 짧고 명확해야 한다는 점임

뒤뚱뒤뚱

뒤뚱뒤뚱은 발바닥 간격이 비트 간격이 되는 구조라서 시각 채보와 리듬이 강하게 연결됨

A / C : 왼발 착지
B / D : 오른발 착지

성공하면 발자국이 지워지고 귀여운 뿅뿅 사운드가 나오는 식으로 피드백을 줄 수 있음

실패하면 발자국이 남고 헛디디는 사운드와 애니메이션을 같이 재생하면 될 것 같음

이 미니게임은 효과음이 너무 튀면 박자감을 방해할 수 있으니, BGM과 효과음 볼륨 밸런스를 특히 조심해야 함

따라쟁이 동물

따라쟁이 동물은 오른쪽 동물이 먼저 소리와 동작을 보여주고, 한 박자 쉰 뒤 Start UI가 뜨면 왼쪽 동물로 따라하는 구조임

이 미니게임은 단순 Input 이벤트만으로는 부족할 수 있음

PreviewCue : 오른쪽 동물이 먼저 보여주는 타이밍
InputCue   : 플레이어가 따라해야 하는 타이밍

A / B / C / D는 동작 종류로 쓰고, cue 값으로 Preview인지 Input인지 나누는 방식이 좋아보임

Wwise는 PreviewCue에서 동물 울음소리나 동작 소리를 먼저 재생하고, InputCue에서는 입력 결과에 따라 성공 / 실패 사운드를 재생하면 됨

주사위 굴리기

주사위 굴리기는 방향 입력이 핵심이라 A / B / C / D가 방향에 대응됨

A : 왼쪽
B : 위
C : 오른쪽
D : 아래

기획서에 타일 크기에 따른 변속 구간이 있으므로, extra 값으로 타일 크기나 속도 배율을 넘기는 방식을 생각해볼 수 있음

extra : tileScale 또는 speedMultiplier

Wwise는 주사위가 굴러가는 반복 사운드와 타일에 도착하는 착지 사운드를 분리하면 좋을 것 같음

물고기 낚시

물고기 낚시는 완곡 성공 시 물고기를 낚아올리고, 실패하면 놓치는 구조임

점수 대신 물고기 길이를 결과로 보여줄 수 있다는 점이 특징임

정확도가 높을수록 물고기 길이 증가
Miss가 많을수록 물고기가 도망갈 확률 증가
완곡 성공 시 낚아올리기 연출
실패 시 놓치기 연출

Wwise는 물속 분위기, 낚싯줄 당기는 소리, 성공 시 첨벙 소리 등을 담당하면 될 것 같음

보스 잡기

보스 잡기는 리듬에 맞춰 패링하면 몬스터 체력이 깎이는 형태임

여기서는 판정 결과가 바로 전투 피드백으로 이어져야 함

Perfect : 강한 패링 사운드와 큰 타격 이펙트
Good    : 약한 타격 사운드
Miss    : 피격 사운드와 화면 흔들림

Wwise RTPC를 사용하면 BossHP를 넘겨서 체력이 낮아질수록 음악을 고조시키는 것도 가능할 것 같음

다만 이건 기본 판정과 체력 감소 구조가 잡힌 뒤에 적용하는 게 좋아보임


Wwise Event 이름 규칙

팀 프로젝트에서는 이름 규칙을 빨리 정해두는 게 중요함

처음에 대충 만들면 나중에 Wwise Browser에서 이벤트 찾는 시간이 길어질 것 같음

초기 규칙은 이렇게 잡을 수 있을 것 같음

BGM
Play_BGM_Game
Stop_BGM_Game
Pause_BGM_Game
Resume_BGM_Game

UI
Play_UI_Select
Play_UI_Confirm
Play_UI_Cancel
Play_UI_Result

Judge
Play_Judge_Perfect
Play_Judge_Good
Play_Judge_Miss
Play_Combo_Break

Minigame
Play_Jump_Land
Play_Waddle_Step
Play_CopyAnimal_Voice
Play_Dice_Roll
Play_Fishing_Reel
Play_Boss_Parry

공통 판정 사운드는 Judge 그룹으로 두고, 미니게임 고유 사운드는 Minigame 쪽으로 분리하는 게 좋아보임

이렇게 해두면 점프점프에서만 쓰는 소리와 모든 미니게임에서 공통으로 쓰는 소리를 구분하기 쉬움


RTPC와 State 사용 범위

Wwise의 RTPC와 State는 게임 상태를 사운드에 반영하는 데 사용할 수 있음

하지만 1차 구현부터 너무 많이 넣으면 구현 범위가 커질 수 있음

초기에는 이 정도만 고려하면 될 것 같음

RTPC_Combo
RTPC_Accuracy
RTPC_BossHP

State_Gameplay
- Title
- Select
- Playing
- Result

Switch_Minigame
- Jump
- Waddle
- CopyAnimal
- Dice
- Fishing
- Boss

RTPC_Combo는 콤보가 올라갈수록 효과음의 밝기나 관객 소리를 조금 키우는 데 사용할 수 있음

RTPC_Accuracy는 결과 화면이나 피버 연출과 연결할 수 있음

RTPC_BossHP는 보스전에서 체력에 따라 음악 분위기를 바꾸는 데 사용할 수 있음

다만 이 프로젝트는 귀엽고 직관적인 미니게임 감각이 중요하므로, 사운드 연출이 입력 타이밍을 방해하면 안 됨


구현 구조 초안

최종 프로젝트에서 사용할 수 있는 구조를 생각해보면 다음과 같음

URhythmAudioSubsystem
- Wwise Event 재생
- BGM 시작 / 정지 / 일시정지
- Wwise Callback 수신
- RTPC / State / Switch 전달

URhythmChartSubsystem
- .rhythmchart 로드
- 현재 플레이 시간 계산
- Chart Event 발생
- Offset 적용

URhythmJudgeComponent
- 입력 시간 기록
- 가장 가까운 Chart Event 탐색
- Perfect / Good / Miss 계산

IRhythmMinigameInterface
- A / B / C / D 액션 수신
- 미니게임별 성공 / 실패 연출 처리

URhythmResultComponent
- 점수
- 콤보
- 판정 통계
- 최고점수 갱신 여부

 

AudioSubsystem과 ChartSubsystem은 역할을 분리해야 할 것 같음

AudioSubsystem은 Wwise와 연결되는 부분을 담당하고, ChartSubsystem은 채보와 판정 기준 시간을 담당함

JudgeComponent는 ChartSubsystem에서 제공하는 이벤트를 기준으로 입력을 비교하고, 판정 결과를 UI와 AudioSubsystem에 전달하는 방식이 좋아보임

이렇게 하면 Wwise 설정이 바뀌어도 판정 로직이 크게 흔들리지 않고, 미니게임이 늘어나도 공통 구조를 유지할 수 있음