- C++ 코드카타
- Ch3 개인 프로젝트 구현
- 알고리즘 수업 수강

이미지를 보다 시피, 위와 같이 다락문 함정이 세팅되었었다.
하지만, 이 다락문 함정의 경우 문제는 다락문의 피벗이 루트로 되어있다는 점이었다.
계층 구조는 다음과 같이 되어있었다.
Pivot(RootScene)
|-- TrapDoor(Mesh)
|-- TriggerBox(BoxComponent)
루트 컴포넌트의 경우, 월드 좌표계를 기준으로 잡기 때문에 피벗을 회전하게 되면 월드 좌표를 기준으로 회전해버려서 다락문 액터가 다른 회전값으로 놓여질 경우 이상하게 회전해버린다.
그래서 다음과 같이 씬 컴포넌트를 하나 더 추가하여 구조를 바꿔주었다.

이렇게 되어서 각도를 바꿔주더라도 로컬 좌표 기준으로 회전값을 반영해주는 모습을 볼 수 있다.

나는 이 프로젝트에서 사용하는 모든 것들을 AI로 만들기로 했기 때문에 BGM 또한 AI로 만들어보기로 했다.
유튜브를 보다 보면 한 번쯤 들어보았을 AI 노래들이 거의 Suno로 만들어졌기 때문에 Suno를 택하기로 했다.
Suno 사이트: https://suno.com/
Suno의 경우 장르에 대한 키워드를 바탕으로 AI를 만들어준다.
하지만, 이러한 장르에 어떠한 키워드를 줘야할 지 몰라서 Gemini에게 게임 플레이 영상을 바탕으로 아이디어를 제시해달라고 하였다.

그랬더니 다음과 같은 곡을 만들어주었다.
https://drive.google.com/file/d/1pszZTtqobPXIeAMwp9NiXykyVdT9qmA8/view?usp=sharing
꽤나 우스꽝스러운 곡이 나온 것 같아서 만족스러웠다.
이제는 이 BGM을 플레이 하도록 해주는 서브시스템을 구현해주었다.
// KnightBGMSubsystem.h
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
UFUNCTION(BlueprintCallable, Category = "Audio")
void PlayBGM(USoundBase* NewBGM, float VolumeMultiplier = 1.0f);
UFUNCTION(BlueprintCallable, Category = "Audio")
void StopBGM();
private:
UPROPERTY()
TObjectPtr<UAudioComponent> CurrentBGMComponent;
// KnightBGMSubsystem.cpp
void UKnightBGMSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
CurrentBGMComponent = nullptr;
}
void UKnightBGMSubsystem::Deinitialize()
{
StopBGM();
Super::Deinitialize();
}
void UKnightBGMSubsystem::PlayBGM(USoundBase* NewBGM, float VolumeMultiplier)
{
if (NewBGM == nullptr) return;
StopBGM();
CurrentBGMComponent = UGameplayStatics::SpawnSound2D(this, NewBGM, VolumeMultiplier);
}
void UKnightBGMSubsystem::StopBGM()
{
if (CurrentBGMComponent && CurrentBGMComponent->IsPlaying())
{
CurrentBGMComponent->Stop();
CurrentBGMComponent = nullptr;
}
}
이후 BGM을 랜덤으로 출력하도록 MetaSound를 세팅해주었고

캐릭터 블루프린트에 서브시스템을 호출하여 BGM을 실행하도록 해주었다.

이렇게 하면, 게임 시작 시 BGM이 나오게 된다. 아직은 BGM을 트는 방식을 세팅하지 않아서 간단하게만 세팅했는데 추후 고려를 해봐야 할 것 같다.
어쩌다보니 함정 추가 구현이 아닌 다른쪽으로 새었는데, 내일은 추가 구현과 동시에 과제를 진행할 것 같다.