diff --git a/Content/Assets/Curves/DissolveCurve.uasset b/Content/Assets/Curves/DissolveCurve.uasset new file mode 100644 index 0000000..ecb9f4d Binary files /dev/null and b/Content/Assets/Curves/DissolveCurve.uasset differ diff --git a/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Optimized.uasset b/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Optimized.uasset index 0f2f812..cd7de0e 100644 Binary files a/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Optimized.uasset and b/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Optimized.uasset differ diff --git a/Content/Assets/Materials/MI_DissolveEffect.uasset b/Content/Assets/Materials/MI_DissolveEffect.uasset index 4bf897f..768172c 100644 Binary files a/Content/Assets/Materials/MI_DissolveEffect.uasset and b/Content/Assets/Materials/MI_DissolveEffect.uasset differ diff --git a/Content/Blueprints/Character/BP_BlasterCharacter.uasset b/Content/Blueprints/Character/BP_BlasterCharacter.uasset index 7e88429..218f3c8 100644 Binary files a/Content/Blueprints/Character/BP_BlasterCharacter.uasset and b/Content/Blueprints/Character/BP_BlasterCharacter.uasset differ diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index bf58919..3bc6f9b 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -49,6 +49,8 @@ ABlasterCharacter::ABlasterCharacter() TurningInPlace = ETurningInPlace::ETIP_NotTurning; NetUpdateFrequency = 66.f; MinNetUpdateFrequency = 33.f; + + DissolveTimeline = CreateDefaultSubobject(TEXT("DissolveTimelineComponent")); } void ABlasterCharacter::BeginPlay() @@ -120,6 +122,15 @@ void ABlasterCharacter::MulticastEliminated_Implementation() { bEliminated = true; PlayEliminatedMontage(); + + if (DissolveMaterialInstance) + { + DynamicDissolveMaterialInstance = UMaterialInstanceDynamic::Create(DissolveMaterialInstance, this); + GetMesh()->SetMaterial(0, DynamicDissolveMaterialInstance); + DynamicDissolveMaterialInstance->SetScalarParameterValue(TEXT("Dissolve"), 0.55f); + DynamicDissolveMaterialInstance->SetScalarParameterValue(TEXT("Glow"), 200.f); + } + StartDissolve(); } void ABlasterCharacter::EliminationTimerFinished() @@ -477,6 +488,24 @@ void ABlasterCharacter::UpdateHUDHealth() } } +void ABlasterCharacter::UpdateDissolveMaterial(float DissolveValue) +{ + if (DynamicDissolveMaterialInstance) + { + DynamicDissolveMaterialInstance->SetScalarParameterValue(TEXT("Dissolve"), DissolveValue); + } +} + +void ABlasterCharacter::StartDissolve() +{ + DissolveTrack.BindDynamic(this, &ABlasterCharacter::UpdateDissolveMaterial); + if (DissolveCurve && DissolveTimeline) + { + DissolveTimeline->AddInterpFloat(DissolveCurve, DissolveTrack); + DissolveTimeline->Play(); + } +} + void ABlasterCharacter::SetOverlappingWeapon(AWeapon* Weapon) { if (OverlappingWeapon) diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 5b8c54c..32586ad 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "Blaster/Interfaces/InteractWithCrosshairInterface.h" #include "Blaster/Types/TurningInPlace.h" +#include "Components/TimelineComponent.h" #include "GameFramework/Character.h" #include "BlasterCharacter.generated.h" @@ -123,6 +124,26 @@ private: FTimerHandle EliminationTimer; void EliminationTimerFinished(); + + // Dissolve effect + UPROPERTY(VisibleAnywhere) + UTimelineComponent* DissolveTimeline; + FOnTimelineFloat DissolveTrack; + + UPROPERTY(EditAnywhere) + UCurveFloat* DissolveCurve; + + UFUNCTION() + void UpdateDissolveMaterial(float DissolveValue); + void StartDissolve(); + + // Dynamic instance that we can change at runtime + UPROPERTY(VisibleAnywhere, Category = Elimination) + UMaterialInstanceDynamic* DynamicDissolveMaterialInstance; + + // Material instance set on the Blueprint, used with the dynamic material instance + UPROPERTY(EditAnywhere, Category = Elimination) + UMaterialInstance* DissolveMaterialInstance; public: void SetOverlappingWeapon(AWeapon* Weapon);