Files
Naked-Desire/Source/NakedDesire/Global/AudioSettingsSubsystem.cpp
T
2026-06-05 20:00:33 +03:00

76 lines
2.4 KiB
C++

// © 2025 Naked People Team. All Rights Reserved.
#include "AudioSettingsSubsystem.h"
#include "AudioSettingsConfig.h"
#include "NakedDesireGameInstance.h"
#include "NakedDesireUserSettings.h"
#include "Kismet/GameplayStatics.h"
#include "Sound/SoundClass.h"
#include "Sound/SoundMix.h"
#include "UObject/UObjectGlobals.h"
void UAudioSettingsSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
if (UNakedDesireUserSettings* Settings = UNakedDesireUserSettings::GetNakedDesireUserSettings())
Settings->OnSettingsChanged.AddUniqueDynamic(this, &UAudioSettingsSubsystem::HandleSettingsChanged);
// SoundMix overrides are world-scoped, so re-push them every time a level finishes loading.
MapLoadHandle = FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UAudioSettingsSubsystem::HandleMapLoaded);
}
void UAudioSettingsSubsystem::Deinitialize()
{
if (UNakedDesireUserSettings* Settings = UNakedDesireUserSettings::GetNakedDesireUserSettings())
Settings->OnSettingsChanged.RemoveDynamic(this, &UAudioSettingsSubsystem::HandleSettingsChanged);
FCoreUObjectDelegates::PostLoadMapWithWorld.Remove(MapLoadHandle);
Super::Deinitialize();
}
void UAudioSettingsSubsystem::HandleSettingsChanged(UNakedDesireUserSettings* Settings)
{
ApplyVolumes();
}
void UAudioSettingsSubsystem::HandleMapLoaded(UWorld* LoadedWorld)
{
ApplyVolumes();
}
void UAudioSettingsSubsystem::ApplyVolumes()
{
const UNakedDesireGameInstance* GameInstance = Cast<UNakedDesireGameInstance>(GetGameInstance());
if (!GameInstance || !GameInstance->AudioConfig)
return;
const UAudioSettingsConfig* Config = GameInstance->AudioConfig;
if (!Config->SettingsMix)
return;
UWorld* World = GetWorld();
if (!World)
return;
const UNakedDesireUserSettings* Settings = UNakedDesireUserSettings::GetNakedDesireUserSettings();
if (!Settings)
return;
auto ApplyClass = [&](USoundClass* SoundClass, float Volume)
{
if (!SoundClass)
return;
// Pitch 1.0, no fade — instantaneous so the slider feels responsive.
UGameplayStatics::SetSoundMixClassOverride(World, Config->SettingsMix, SoundClass, Volume, 1.0f, 0.0f, true);
};
ApplyClass(Config->MasterClass, Settings->GetGlobalVolume());
ApplyClass(Config->MusicClass, Settings->GetMusicVolume());
ApplyClass(Config->SfxClass, Settings->GetSfxVolume());
UGameplayStatics::PushSoundMixModifier(World, Config->SettingsMix);
}