Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
GlobalAudioSubsystem.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CoreMinimal.h"
8#include "FMODBlueprintStatics.h"
9#include "FMODBus.h"
10#include "GameplayTagContainer.h"
11#include "Subsystems/GameInstanceSubsystem.h"
12
13#include "GlobalAudioSubsystem.generated.h"
14
15class UAudioData;
16class UFMODAudioComponent;
17class USceneComponent;
18class UWorld;
19
20UCLASS()
21class CK_UE_API UGlobalAudioSubsystem : public UGameInstanceSubsystem
22{
23 GENERATED_BODY()
24
25public:
26 virtual void Initialize(FSubsystemCollectionBase& Collection) override;
27 virtual void Deinitialize() override;
28
29public:
30 UFUNCTION(BlueprintCallable, Category = "Audio|BGM")
31 bool PlayBGM(UAudioData* SourceAudioData, FGameplayTag BGMTag, bool bStopOtherBGM = true);
32
33 UFUNCTION(BlueprintCallable, Category = "Audio|BGM")
34 void StopBGM();
35
36 UFUNCTION(BlueprintPure, Category = "Audio|BGM")
37 bool IsPlayingBGM(FGameplayTag BGMTag) const;
38
39 UFUNCTION(BlueprintCallable, Category = "Audio|Volume")
40 void SetBGMVolume(float NewVolume);
41
42 UFUNCTION(BlueprintCallable, Category = "Audio|Volume")
43 void SetSFXVolume(float NewVolume);
44
45 UFUNCTION(BlueprintCallable, Category = "Audio|Volume")
46 void SetAMBVolume(float NewVolume);
47
48public:
49 UFUNCTION(BlueprintCallable, Category = "Audio|Tag")
50 bool PlayAudioTagAtLocation(UAudioData* SourceAudioData, FGameplayTag AudioTag, FVector Location);
51
52 UFUNCTION(BlueprintCallable, Category = "Audio|Tag")
53 UFMODAudioComponent* StartLoopAudioTag(UAudioData* SourceAudioData, FGameplayTag AudioTag, USceneComponent* AttachToComponent);
54
55 UFUNCTION(BlueprintCallable, Category = "Audio|Tag")
56 void StopLoopAudio(UFMODAudioComponent* LoopAudioComponent);
57
58public:
59 UFUNCTION(BlueprintPure, Category = "Audio|Volume")
60 FORCEINLINE float GetBGMVolume() const
61 {
62 return BGMVolume;
63 }
64
65 UFUNCTION(BlueprintPure, Category = "Audio|Volume")
66 FORCEINLINE float GetSFXVolume() const
67 {
68 return SFXVolume;
69 }
70
71 UFUNCTION(BlueprintPure, Category = "Audio|Volume")
72 FORCEINLINE float GetAMBVolume() const
73 {
74 return AMBVolume;
75 }
76
77private:
78 // 재생 중인 BGM 하나의 상태.
80 {
81 FFMODEventInstance Instance {};
82 bool bLevelChangeContinue = true;
83 };
84
85private:
86 FORCEINLINE UFMODBus* GetBGMBus()
87 {
88 if (const UGlobalAudioSettings* Settings = GetDefault<UGlobalAudioSettings>())
89 {
90 return LoadBus(Settings->GetBGMBus(), CachedBGMBus);
91 }
92 else
93 {
94 return nullptr;
95 }
96 }
97
98 FORCEINLINE UFMODBus* GetSFXBus()
99 {
100 if (const UGlobalAudioSettings* Settings = GetDefault<UGlobalAudioSettings>())
101 {
102 return LoadBus(Settings->GetSFXBus(), CachedSFXBus);
103 }
104 else
105 {
106 return nullptr;
107 }
108 }
109
110 FORCEINLINE UFMODBus* GetAMBBus()
111 {
112 if (const UGlobalAudioSettings* Settings = GetDefault<UGlobalAudioSettings>())
113 {
114 return LoadBus(Settings->GetAMBBus(), CachedAMBBus);
115 }
116 else
117 {
118 return nullptr;
119 }
120 }
121
122 FORCEINLINE UFMODBus* LoadBus(const TSoftObjectPtr<UFMODBus>& SourceBus, TObjectPtr<UFMODBus>& CachedBus)
123 {
124 if (CachedBus)
125 {
126 return CachedBus;
127 }
128
129 if (SourceBus.IsNull())
130 {
131 return nullptr;
132 }
133
134 CachedBus = SourceBus.LoadSynchronous();
135 return CachedBus;
136 }
137
138 bool IsEventInstancePlaying(const FFMODEventInstance& EventInstance) const;
139 void StopEventInstance(const FFMODEventInstance& EventInstance) const;
140 void OnPostLoadMap(UWorld* LoadedWorld);
141
142 void StopBGMByTag(FGameplayTag BGMTag);
143
144private:
145 UPROPERTY(Transient)
146 TObjectPtr<UFMODBus> CachedBGMBus;
147
148 UPROPERTY(Transient)
149 TObjectPtr<UFMODBus> CachedSFXBus;
150
151 UPROPERTY(Transient)
152 TObjectPtr<UFMODBus> CachedAMBBus;
153
154private:
155 TMap<FGameplayTag, FActiveBGMEntry> ActiveBGMs;
156
157 FDelegateHandle PostLoadMapHandle;
158
159 float BGMVolume = 1.0f;
160 float SFXVolume = 1.0f;
161 float AMBVolume = 1.0f;
162};
Definition AudioData.h:76
Definition GlobalAudioSettings.h:14
Definition GlobalAudioSubsystem.h:22
FORCEINLINE UFMODBus * GetAMBBus()
Definition GlobalAudioSubsystem.h:110
FORCEINLINE UFMODBus * LoadBus(const TSoftObjectPtr< UFMODBus > &SourceBus, TObjectPtr< UFMODBus > &CachedBus)
Definition GlobalAudioSubsystem.h:122
FORCEINLINE UFMODBus * GetBGMBus()
Definition GlobalAudioSubsystem.h:86
FORCEINLINE UFMODBus * GetSFXBus()
Definition GlobalAudioSubsystem.h:98
Definition GlobalAudioSubsystem.h:80