[CH4-18] Unreal Engine 배경음악 겹침 문제 해결

김여울·2025년 10월 5일

내일배움캠프

목록 보기
90/139

💥 문제 상황

  • 레벨 블루프린트와 위젯 블루프린트에서 PlaySound2D로 배경음악 재생

  • 메인메뉴레벨에서 히든승리UI로 전환 시 두 배경음악이 동시에 재생되는 문제 발생

🔧 해결 과정

: GameInstance 중앙 관리 방식

1. C++ 코드 구현

GameInstance.h에 추가:

UPROPERTY()
class UAudioComponent* CurrentBGMComponent;

UFUNCTION(BlueprintCallable, Category = "Audio")
void PlayBackgroundMusic(USoundBase* NewMusic);

UFUNCTION(BlueprintCallable, Category = "Audio") 
void StopBackgroundMusic();

GameInstance.cpp에 추가:

void UDCGameInstance::PlayBackgroundMusic(USoundBase* NewMusic)
{
    // 기존 음악 정지
    if (IsValid(CurrentBGMComponent) && CurrentBGMComponent->IsPlaying())
    {
        CurrentBGMComponent->Stop();  // Stop()() 아닌 Stop()만 사용!
    }
    
    // 새 음악 재생
    if (NewMusic)
    {
        CurrentBGMComponent = UGameplayStatics::SpawnSound2D(
            this, NewMusic, 1.0f, 1.0f, 0.0f
        );
    }
}

2. 블루프린트 연결 방법

  • 기존 PlaySound2D 노드 제거

  • Event Construct → Get Game Instance → Cast To DCGameInstance

  • As DCGameInstance 핀에서 Play Background Music 함수 호출

  • New Music 핀에 사운드 에셋 연결


✅ 최종 동작

  • 중앙 관리: 모든 배경음악을 한 곳에서 제어

  • 자동 정지: 새 음악 재생 시 기존 음악 자동 중단

  • 레벨 간 지속: GameInstance는 레벨 전환과 무관하게 유지

  • 확장성: 나중에 복잡한 음악 시스템으로 확장 용이

💡 기억해라!

  • 모든 배경음악을 GameInstance 방식으로 통일해야 함

  • 일부만 바꾸면 여전히 음악 겹침 발생

  • UPROPERTY() 선언으로 GC 보호 필요

  • IsValid() 체크로 안전한 포인터 접근

🧠 배운 것

  • 단순한 음악 겹침 문제도 아키텍처 관점에서 접근하는 것이 중요

  • 블루프린트와 C++ 혼용 시 일관성 있는 패턴 적용 필요

  • GameInstance는 전역 상태 관리에 매우 유용한 패턴

0개의 댓글