검방패 사운드 작업 정리
0. 한 줄 요약
검방패 콤보어택 스윙 사운드를 랜덤 큐 + 몽타주 노티파이로 구현·검증 완료
히트음/설정볼륨연동/CastSound/소환액터음은 방식 확정 후 보류 또는 진행 예정.
1. 완료된 작업 (monolith로 적용·저장·검증)
1-1. 랜덤 Sound Cue 2개 생성 — /Game/Retrieve/Audio/SwordShield/
| 큐 | 구성 | 변조 |
|---|---|---|
SC_SSH_ComboSwing (스윙) |
SW_Whoosh_Metal_4-1/2/3/5/7 → Random |
Pitch 0.9 |
SC_SSH_SwordHit (히트) |
SW_Sword_Hit_1-1/3/4 + SW_Generic_Hit_1-1/4 → Random |
Pitch 0.92 |
- 원본 wav 위치:
Content/External/NaPH_RPG_Fantasy_Sounds_Bunle/Weapons_and_Combat/wav/ - 구조:
WavePlayer(N) → Random → Modulator → Output - 큐 안에는 cue(SC_)가 아니라 wav(SW_)를 넣음. cue = 레시피(랜덤/변조), wav = 재료.
1-2. 스윙 노티파이 9개 배치 (3 몽타주 × 콤보 3타)
Play Sound노티파이를 각 콤보 타의 슬래시 VFX(PlayNiagaraEffect)와 같은 시점,SlashEffect트랙에 배치 →SC_SSH_ComboSwing연결
| 몽타주 | 스윙 시점(초) |
|---|---|
AM_SSH_WindComboAttack |
0.352 / 2.141 / 3.645 |
AM_SSH_FireComboAttack |
0.344 / 2.125 / 3.641 |
AM_SSH_WaterComboAttack |
0.810 / 2.166 / 3.977 |
- 검증:
find_audio_references(SC_SSH_ComboSwing)→ 위 3개 몽타주 모두 참조 확인 ✅
2. 핵심 아키텍처 (참고)
콤보 사운드 = 2개 레이어 (기존 VFX 패턴과 동일):
- 스윙(휘두르기) → 콤보 몽타주의
Play SoundAnimNotify (= 슬래시 VFX와 같은 위치) - 히트(타격) →
GCN_Hit_ImpactGameplayCue (= 히트 VFX와 같은 위치)
콤보 구동: GA_Attack이 FWeaponComboStep.SectionName별로 몽타주 섹션을 따로 재생.
→ 노티파이는 반드시 해당 섹션 시간 범위 안에 있어야 그 타에서 울림.
3. 남은 작업 (TODO)
3-1. 히트음 — GCN_Hit_Impact에 연결 (보류: 읽기전용)
GCN_Hit_Impact(/Game/Retrieve/AbilitySystem/GameplayCues/), 타입GameplayCueNotify_Static, tagGameplayCue.Combat.Hit- Burst Sounds 배열이 없는 타입 → OnExecute 그래프에
Play Sound at Location노드 추가 필요- Sound =
SC_SSH_SwordHit - Location = 기존
NS_Hit_Impact(Spawn System at Location)가 쓰는 위치 핀과 동일하게 연결 (보통Parameters.Location)
- Sound =
- 막힌 이유:
GCN_Hit_Impact.uasset이 읽기전용 → 해제 후 진행 (attrib -r또는 속성창)
3-2. 설정 볼륨(SFX 슬라이더) 연동 — 미설정 상태
- 현재
ApplyAudio()는 SoundMix + SoundClass override 방식인데 SoundMix/SoundClass 애셋이 프로젝트에 미할당 → Master 슬라이더만 작동, SFX 등 개별 채널은 무효 - 연동하려면:
SoundMix1개 +SoundClass계층 생성 (Master 루트 → SFX/Music/Ambience/UI/Voice 자식)- Project Settings → Game → "Retrieve Settings"에서 SettingsSoundMix / 각 채널 SoundClass 할당
- 큐들(
SC_SSH_ComboSwing/SC_SSH_SwordHit/SC_SSH_HeavySwing)의 Sound Class = SFX로 지정
- 코드 위치:
Source/Retrieve/Settings/RetrieveSettingsSubsystem.cpp(ApplyAudio),RetrieveSettingsConfig.h
3-3. CastSound — 미연결(dead field)
FSkillCombination::CastSound(RetrieveDataTableTypes.h:857),FWeaponHeavyAttack::CastSound(:1331) 둘 다 코드에서 안 읽힘BeginBurstSkill(Row)이 9개 필드만 복사하고 CastSound는 복사 안 함 → 데이터 넣어도 무동작- 살리려면 ①C++:
BeginBurstSkill에 아래 추가(재컴파일 필요), 또는 ②시전 몽타주에 AnimNotifyif (USoundBase* Cast = Row->CastSound.LoadSynchronous()) if (const AActor* O = GetOwner()) UGameplayStatics::PlaySoundAtLocation(O->GetWorld(), Cast, O->GetActorLocation()); - 참고:
FBurstHitInstance::HitSound(per-hit)는 이미 작동 중(PlayerBurstComponent.cpp:400)
3-4. 소환 액터(WorldSpawnActor) 사운드 → 액터 BP에 (몽타주 아님)
- 이유: 월드 액터는
Owner + 정면*WorldSpawnDistance(플레이어에서 떨어진 곳)에 스폰됨. 몽타주 노티파이는 캐릭터 위치에서 울려 위치가 틀림.BurstWorldActorBase설계도 "비주얼은 BP 자식 SceneRoot 아래 추가". - 방법(에디터, WorldSpawnActorClass가 가리키는 BP):
- 권장: Audio Component 추가(SceneRoot 아래), Sound=큐, Auto Activate=true → 스폰 위치에서 재생·따라다님·파괴 시 자동정지
- 또는 일회성: Event BeginPlay → Play Sound at Location (Location=GetActorLocation)
- 퇴장(가라앉기)음은
BeginSink가 private C++라 BP 훅 불가 → 필요시 별도 C++ 노출
4. 트러블슈팅
4-1. BP_FFF_WorldActor 저장 에러 (RF_Standalone 누락)
- 에러:
... does not have any of the provided object flags (0x10000002) - 의미: BP 오브젝트에
RF_Standalone(0x2) /RF_HasExternalPackage(0x10000000) 둘 다 없음 → 최상위 애셋으로 인식 안 돼 저장 거부. (자동화/복제로 생성된 BP에서 흔함) - 해결 A(작업 유지): 에디터 콘솔에
save.FixupStandaloneFlags 1입력 → 저장(Ctrl+S). 한 번 저장되면 영구 수정. (안 먹으면-dpcvars=save.FixupStandaloneFlags=1인자로 재실행) - 해결 B(확실): 깨진 BP 삭제 →
BurstWorldActorBase부모로 Blueprint Class 재생성 → 컴포넌트 재추가
5. 주의/리마인더
- ⚠️ 사운드 번들
Content/External/NaPH_RPG_Fantasy_Sounds_Bunle/가 git 미추적 → 새 큐가 이 wav 참조하므로 번들 커밋(또는 팀 공유) 필수, 안 그러면 팀원 쪽 참조 깨짐 - 새 큐는 추적 경로
Content/Retrieve/Audio/SwordShield/에 저장됨 - Wind 몽타주에 빈
Sound트랙 잔재 가능(첫 시도 부산물, 무해) - 스윙음이 슬래시와 동시 재생 — 더 "치고 나가는" 느낌 원하면 노티파이 1~2프레임 앞당김