레벨 전환시 BGM이 처음부터 재생되는 문제를 해결하기위해 몇가지 시도를 거쳤다.
1.게임모드에서 BGM재생(실패)
기존 레벨에 앰비언트 사운드를 배치하는 방식에서 게임모드에서 Sound Que를 사용해 재생하도록 수정하고
테스트했으나 변화가 없었다.
이후 검색을통해 레벨 전환시 BGM이유지되는 방법을 찾아봤고 두가지 방법을 찾게되었다.
1.게임인스턴스 사용
https://blog.naver.com/chvj7567/222775488516
언리얼(Unreal) - 프로젝트 BGM(레벨 이동 시 BGM 유지)
레벨이 이동되어도 BGM이 유지되도록 하기 위해 게임인스턴스 클래스에서 실행하도록 할 것이다. 게임 ...
blog.naver.com
게임인스턴스를 사용해 레벨이동시 BGM를 유지하는방법이다. 게임인스턴스는 언리얼에서 싱글톤처럼 사용된다고 하는데 이방법이 정석은아니라고해서 나는 두번째방법을 선택했다.
2. 레벨스트리밍
https://forums.unrealengine.com/t/keep-music-playing-while-switching-levels/291452
Keep music playing while switching levels
Hi, I want to play a music track on the background of my game, and since my levels are pretty short it would be nice if the music didn’t restart every time a new level is loaded. How would I approach this? Currently I load new levels with the following c
forums.unrealengine.com
포럼에서 퍼시스턴스레벨에 레벨을 로드 언로드 하는 방법이 있다는 정보를 보고 알게된 방법이다. 실제 언리얼로 실무를 보는 지인에게 물어본결과 보통 이런방법을 사용한다고해서 나는 이방법을 선택해서 구현을 시도했다.
먼저 BGM액터만을 소유한 기본레벨을 하나 생성하고 이를 퍼시스턴트레벨로 지정했다.
퍼시스턴트 레벨이란 지속 레벨 즉, 항상 로드되는 레벨이라고 한다.
창탭의 레벨창을 키고 여기에 맵오브젝트를 보유한 1번과 레벨전환을 구분하기위해 아무 장애물이없는 2번을 배치했다.
그리고 1번레벨의경우 기본적으로 시작부터 존재해야되기때문에 스트리밍방법을 항상 로드됨으로 수정해줬다.
레벨에 배치하기만해도 모든오브젝트가 에디터의 월드아웃라이너에 전부 나타나므로 게임시작시엔 보이지않더라도
작업의 편의를위해 2번은 에디터에 나타나지않도록 수정했다.
레벨스트리밍과 관련된 코드는 다음과 같다.
//레벨이동CPP
FLatentActionInfo LatentInfo;
LatentInfo.CallbackTarget = this;
LatentInfo.ExecutionFunction = "OnLevelLoaded";
LatentInfo.Linkage = 0;
LatentInfo.UUID = 0;
UGameplayStatics::LoadStreamLevel(this, FName(NextLevelName),true, false, LatentInfo);
void AMoveLevel::OnLevelLoaded()
{
GetWorld()->GetFirstPlayerController()->GetPawn()->SetActorLocation(FVector(0.f,106.69f,200.f));
NiagaraComp->Deactivate();
NiagaraComp->DestroyComponent();
FLatentActionInfo LatentInfo;
UGameplayStatics::UnloadStreamLevel(this, FName(PrevLevelName), LatentInfo,true);
}
참고자료를찾을때 LoadStreamLevel에서 3번째와 4번째 변수가 true와 false로되있어서 각 변수의 의미를 구글링해봣으나 따로 찾지는못했고 챗 GPT를 사용해 자료검색한결과 아래와 같은 결과가나왔다.
FLatentActionInfo의경우 레벨스트리밍 이후 콜백에대한 정보를 등록하는 파라메터같은데 정확한부분까지는
아직은 잘모르겠다. 비동기로 레벨스트리밍을 하기위해 레벨로딩 완료후 콜백에대한 자료를 찾아본결과
저런방식으로 하게된다는것만 알게되었다.
포탈에 접근시 레벨이 전환되는부분까진 문제없이되나 다만 레벨전환시 로딩씬같은게 없어서 위화감이 심하다.
간단하게 페이드인 페이드아웃 효과를 주면 좀더 자연스러워질것같아서 방법을 찾아봤는데 유니티에서 사용했던것처럼 UI와 애니메이션을 활용해 페이드 인&아웃 효과를 주는방법과 또 레벨시퀀스란것을 사용해 페이드인&아웃 효과를 주는방법이 있어서 나는 후자의 방법을 선택했다.
https://docs.unrealengine.com/4.26/ko/AnimatingObjects/Sequencer/HowTo/TracksFade/
씬 페이드 인/아웃
페이드 트랙으로 레벨 시퀀스 페이드 인/아웃 하는 방법 예제입니다.
docs.unrealengine.com
언리얼 공식문서를 참고하여 간단한 페이드트랙을 만들어서 레벨에 추가하고 이를 C++로 제어하도록 수정했다.
C++에서 레벨시퀀스 관련 코드를 사용할때는 Build.cs에 두개의 모듈을 추가해줘야됬는데 나는 모듈 추가 이후에도 컴파일은 되나 자꾸 레벨시퀀스관련 헤더참조에서 빨간줄이 떠서 에디터 재시작이나 이래저래 방법을 시도하다 안되서 한참 헤맸었는데
자료를 찾다가 솔루션파일과 각종 캐시를 삭제하고 프로젝트파일을 다시 Generate하라는 말이있어서 시도해봤는데 다행히 이걸로 해결되었다. 가급적 모듈을 추가할때는 한번씩 이과정을 거쳐주는게 안전할듯 싶다.
레벨 시퀀스 관련 코드는 다음과 같다.
//레벨이동 헤더
class ALevelSequenceActor* LevelSequenceActor;
//레벨이동 CPP
void AMoveLevel::NotifyActorBeginOverlap(AActor* OtherActor)
{
Super::NotifyActorBeginOverlap(OtherActor);
ACharacter* Character = Cast<ACharacter>(OtherActor);
if(Character)
{
LevelSequenceActor->SequencePlayer->OnFinished.AddDynamic(this,&AMoveLevel::OnLevelSequencePlayEnded);
LevelSequenceActor->SequencePlayer->PlayReverse();
}
}
//레벨 시퀀스 재생완료 후 콜백
void AMoveLevel::OnLevelSequencePlayEnded()
{
FLatentActionInfo LatentInfo;
LatentInfo.CallbackTarget = this;
LatentInfo.ExecutionFunction = "OnLevelLoaded";
LatentInfo.Linkage = 0;
LatentInfo.UUID = 0;
UGameplayStatics::LoadStreamLevel(this, FName(NextLevelName),true, false, LatentInfo);
}
//레벨 스트리밍 로드 완료 후 콜백
void AMoveLevel::OnLevelLoaded()
{
GetWorld()->GetFirstPlayerController()->GetPawn()->SetActorLocation(FVector(0.f,106.69f,200.f));
NiagaraComp->Deactivate();
NiagaraComp->DestroyComponent();
FLatentActionInfo LatentInfo;
UGameplayStatics::UnloadStreamLevel(this, FName(PrevLevelName), LatentInfo,true);
}
간단한 효과지만 이전보다 많이 자연스러워졌다.
이걸로 일단은 플랫포머에서 적용해볼만한 간단한 요소들은 다구현해봤으므로 이프로젝트는 마무리한다.
'Unreal > [UE4] 플랫포머 제작 연습(C++)' 카테고리의 다른 글
10. 버튼 위젯 커스텀 (1) | 2023.12.08 |
---|---|
9. 달리기 이펙트, 포탈 이펙트 (2) | 2023.12.07 |
8. 효과음 적용, 레벨전환 (0) | 2023.11.21 |
7. 효과음적용(실패) (1) | 2023.11.14 |
6. 버튼을사용한 캐릭터이동, 배경음악 (0) | 2023.11.13 |