今回は、Unreal Engine 5で音量調整機能を作る方法を解説します。
1. 完成物
最初に、完成の動画を貼付します。
ChatGPTに各機能の関係性についてまとめてもらいました。
ソースは以下
クラス:GameMode
//=======================================================
h
class BLOG_API ABlogGameMode : public AGameModeBase
{
GENERATED_BODY()
private:
void BeginPlay() override;
void CreateMainHUD();
UFUNCTION()
void OnChangedSliderValue(float InValue);
private:
UPROPERTY()
TObjectPtr<class UMainHUD> MainHUD_UI;
UPROPERTY(EditDefaultsOnly)
TSubclassOf<UMainHUD> MainHUDClass;
UPROPERTY(EditDefaultsOnly, Category = "Sound")
TObjectPtr<class USoundClass> BGM_SoundClass;
UPROPERTY(EditDefaultsOnly, Category = "Sound")
TObjectPtr<class USoundMix> SoundMix;
};
//=======================================================
cpp
void ABlogGameMode::BeginPlay()
{
//HUD
CreateMainHUD();
if (IsValid(MainHUD_UI) == false)
{
return;
}
MainHUD_UI->Init();
MainHUD_UI->OnChangedSliderValueDelegate.AddDynamic(this, &ABlogGameMode::OnChangedSliderValue);
UGameplayStatics::PushSoundMixModifier(
GetWorld(),
SoundMix
);
}
void ABlogGameMode::CreateMainHUD()
{
APlayerController* PC = UGameplayStatics::GetPlayerController(GetWorld(), 0);
if (IsValid(PC) == false)
{
return;
}
//MainHUDを生成
MainHUD_UI = Cast<UMainHUD>(CreateWidget(PC, MainHUDClass));
if (IsValid(MainHUD_UI) == false)
{
return;
}
//画面上に表示
MainHUD_UI->AddToViewport(0);
}
/// <summary>
/// スライダーが変更された時
/// </summary>
/// <param name="InValue"></param>
void ABlogGameMode::OnChangedSliderValue(float InValue)
{
UGameplayStatics::SetSoundMixClassOverride(
GetWorld(),
SoundMix,
BGM_SoundClass,
InValue,
1.0f,
0.0f,
true
);
}
クラス:MainHUD
//=======================================================
h
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnChangedSliderValueEvent, float, InValue);
UCLASS()
class BLOG_API UMainHUD : public UUserWidget
{
GENERATED_BODY()
public:
void Init();
FOnChangedSliderValueEvent OnChangedSliderValueDelegate;
private:
UFUNCTION()
void OnChangedSliderValue(float InValue);
private:
UPROPERTY(meta = (BindWidget))
TObjectPtr<class USlider> BGM_Slider;
UPROPERTY(meta = (BindWidget))
TObjectPtr<class UTextBlock> SliderValueText;
};
//=======================================================
cpp
void UMainHUD::Init()
{
BGM_Slider->OnValueChanged.AddDynamic(this, &UMainHUD::OnChangedSliderValue);
}
void UMainHUD::OnChangedSliderValue(float InValue)
{
//小数点第1まで表示
FNumberFormattingOptions Options;
Options.MinimumFractionalDigits = 0;
Options.MaximumFractionalDigits = 0;
FText NextSliderText = FText::AsNumber(InValue * 100, &Options);
//値をセット
SliderValueText->SetText(NextSliderText);
//Sliderの値が変更されたことを通知する
OnChangedSliderValueDelegate.Broadcast(InValue);
}
2.解説
右クリックで、「SoundClassMix」と「SoundClass」を用意します。
音量を調節する「SoundCue」に「SoundClass」を設定します。

BGMのような長い曲の場合、「PlayWhenSilent」に変更しましょう。
UEは音量を0にすると、再生中の曲が「停止」されます。
それを防ぐために変更すると扱いやすくなります。

PushSoundMixModifier() でSoundMixを有効化します。
//SoundMixを有効にする
UGameplayStatics::PushSoundMixModifier(
GetWorld(),
SoundMix
);
この関数に値をセットして、音量を調節します。
SetSoundMixClassOverride() でそのSoundMix内のSoundClass設定を動的に上書きします
UGameplayStatics::SetSoundMixClassOverride(
GetWorld(), // 対象のWorld
SoundMix, // 変更を適用するSoundMix
SoundClass, // 音量を変更する対象のSoundClass
Value, // Volume倍率(0.0 = 無音、1.0 = 通常音量)
1.0f, // Pitch倍率(1.0 = 通常の高さ)
0.0f, // 設定値へ変化するまでの時間(秒)
true // SoundMixに未登録のSoundClassでもOverrideを追加するか
);
なので、初期化で以下のようにかけば、ゲーム開始時に保存済みの音量を適用できます。
//セーブデータから保存してるBGMのボリュームを取得
float bgmVolume = saveData->GetBGMVolume();
//音量を適応
UGameplayStatics::SetSoundMixClassOverride(
GetWorld(), // 対象のWorld
SoundMix, // 変更を適用するSoundMix
BGM_SoundClass, // 音量を変更する対象のSoundClass
bgmVolume, // Volume倍率(0.0 = 無音、1.0 = 通常音量)
1.0f, // Pitch倍率(1.0 = 通常の高さ)
0.0f, // 設定値へ変化するまでの時間(秒)
true // SoundMixに未登録のSoundClassでもOverrideを追加するか
);
ネットで調べると、C++で設定画面の音量調整を作ってる方って少なかったのでまとめました。
自分用に最小でまとめましたので皆さんのお役に立てれば嬉しいです

