// Copyright Epic Games, Inc. All Rights Reserved. #include "LyraContextEffectComponent.h" #include "LyraContextEffectsLibrary.h" #include "LyraContextEffectsSubsystem.h" #include "NiagaraFunctionLibrary.h" #include "PhysicalMaterials/PhysicalMaterial.h" // Sets default values for this component's properties ULyraContextEffectComponent::ULyraContextEffectComponent() { // Disable component tick, enable Auto Activate PrimaryComponentTick.bCanEverTick = false; bAutoActivate = true; // ... } // Called when the game starts void ULyraContextEffectComponent::BeginPlay() { Super::BeginPlay(); // ... CurrentContexts.AppendTags(DefaultEffectContexts); CurrentContextEffectsLibraries = DefaultContextEffectsLibraries; // On Begin Play, Load and Add Context Effects pairings if (const UWorld* World = GetWorld()) { if (ULyraContextEffectsSubsystem* LyraContextEffectsSubsystem = World->GetSubsystem()) { LyraContextEffectsSubsystem->LoadAndAddContextEffectsLibraries(GetOwner(), CurrentContextEffectsLibraries); } } } void ULyraContextEffectComponent::EndPlay(const EEndPlayReason::Type EndPlayReason) { // On End PLay, remove unnecessary context effects pairings if (const UWorld* World = GetWorld()) { if (ULyraContextEffectsSubsystem* LyraContextEffectsSubsystem = World->GetSubsystem()) { LyraContextEffectsSubsystem->UnloadAndRemoveContextEffectsLibraries(GetOwner()); } } Super::EndPlay(EndPlayReason); } // Implementation of Interface's AnimMotionEffect function void ULyraContextEffectComponent::AnimMotionEffect_Implementation(const FName Bone, const FGameplayTag MotionEffect, USceneComponent* StaticMeshComponent, const FVector LocationOffset, const FRotator RotationOffset, const UAnimSequenceBase* AnimationSequence, const bool bHitSuccess, const FHitResult HitResult, FGameplayTagContainer Contexts, FVector VFXScale, float AudioVolume, float AudioPitch) { // Prep Components TArray AudioComponentsToAdd; TArray NiagaraComponentsToAdd; FGameplayTagContainer TotalContexts; // Aggregate contexts TotalContexts.AppendTags(Contexts); TotalContexts.AppendTags(CurrentContexts); // Check if converting Physical Surface Type to Context if (bConvertPhysicalSurfaceToContext) { // Get Phys Mat Type Pointer TWeakObjectPtr PhysicalSurfaceTypePtr = HitResult.PhysMaterial; // Check if pointer is okay if (PhysicalSurfaceTypePtr.IsValid()) { // Get the Surface Type Pointer TEnumAsByte PhysicalSurfaceType = PhysicalSurfaceTypePtr->SurfaceType; // If Settings are valid if (const ULyraContextEffectsSettings* LyraContextEffectsSettings = GetDefault()) { // Convert Surface Type to known if (const FGameplayTag* SurfaceContextPtr = LyraContextEffectsSettings->SurfaceTypeToContextMap.Find(PhysicalSurfaceType)) { FGameplayTag SurfaceContext = *SurfaceContextPtr; TotalContexts.AddTag(SurfaceContext); } } } } // Cycle through Active Audio Components and cache for (UAudioComponent* ActiveAudioComponent : ActiveAudioComponents) { if (ActiveAudioComponent) { AudioComponentsToAdd.Add(ActiveAudioComponent); } } // Cycle through Active Niagara Components and cache for (UNiagaraComponent* ActiveNiagaraComponent : ActiveNiagaraComponents) { if (ActiveNiagaraComponent) { NiagaraComponentsToAdd.Add(ActiveNiagaraComponent); } } // Get World if (const UWorld* World = GetWorld()) { // Get Subsystem if (ULyraContextEffectsSubsystem* LyraContextEffectsSubsystem = World->GetSubsystem()) { // Set up Audio Components and Niagara TArray AudioComponents; TArray NiagaraComponents; // Spawn effects LyraContextEffectsSubsystem->SpawnContextEffects(GetOwner(), StaticMeshComponent, Bone, LocationOffset, RotationOffset, MotionEffect, TotalContexts, AudioComponents, NiagaraComponents, VFXScale, AudioVolume, AudioPitch); // Append resultant effects AudioComponentsToAdd.Append(AudioComponents); NiagaraComponentsToAdd.Append(NiagaraComponents); } } // Append Active Audio Components ActiveAudioComponents.Empty(); ActiveAudioComponents.Append(AudioComponentsToAdd); // Append Active ActiveNiagaraComponents.Empty(); ActiveNiagaraComponents.Append(NiagaraComponentsToAdd); } void ULyraContextEffectComponent::UpdateEffectContexts(FGameplayTagContainer NewEffectContexts) { // Reset and update CurrentContexts.Reset(NewEffectContexts.Num()); CurrentContexts.AppendTags(NewEffectContexts); } void ULyraContextEffectComponent::UpdateLibraries( TSet> NewContextEffectsLibraries) { // Clear out existing Effects CurrentContextEffectsLibraries = NewContextEffectsLibraries; // Get World if (const UWorld* World = GetWorld()) { // Get Subsystem if (ULyraContextEffectsSubsystem* LyraContextEffectsSubsystem = World->GetSubsystem()) { // Load and Add Libraries to Subsystem LyraContextEffectsSubsystem->LoadAndAddContextEffectsLibraries(GetOwner(), CurrentContextEffectsLibraries); } } }