From 44aee655def094d67963f3ad170d54936726b48a Mon Sep 17 00:00:00 2001 From: aicorr Date: Wed, 16 Apr 2025 22:44:01 +0530 Subject: [PATCH] Fix damage flash implementation --- Content/Blueprints/BP_SpaceshipPawn.uasset | 4 +- Content/Materials/M_StarSparrow_Red1.uasset | 3 + Source/MyProject3/SpaceshipPawn.cpp | 66 +++++++++++++-------- Source/MyProject3/SpaceshipPawn.h | 11 ++++ 4 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 Content/Materials/M_StarSparrow_Red1.uasset diff --git a/Content/Blueprints/BP_SpaceshipPawn.uasset b/Content/Blueprints/BP_SpaceshipPawn.uasset index 12430fa..8e09da3 100644 --- a/Content/Blueprints/BP_SpaceshipPawn.uasset +++ b/Content/Blueprints/BP_SpaceshipPawn.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ca3a33d366307792424f85a42db06b3ef2dbc8374e5c2ce30de5924a0e22bcb -size 33596 +oid sha256:03a3fa023f45c8fe571e1d159000731a0985b8718228a076005ab3c4efeaba01 +size 33878 diff --git a/Content/Materials/M_StarSparrow_Red1.uasset b/Content/Materials/M_StarSparrow_Red1.uasset new file mode 100644 index 0000000..dd3f591 --- /dev/null +++ b/Content/Materials/M_StarSparrow_Red1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21c8a432605a228c3de4f35db49d1db1a806bd4133fc975cb06373fc399bc307 +size 18682 diff --git a/Source/MyProject3/SpaceshipPawn.cpp b/Source/MyProject3/SpaceshipPawn.cpp index 7601099..929fabc 100644 --- a/Source/MyProject3/SpaceshipPawn.cpp +++ b/Source/MyProject3/SpaceshipPawn.cpp @@ -111,6 +111,9 @@ void ASpaceshipPawn::BeginPlay() CurrentHealth = MaxHealth; CurrentShield = MaxShield; LastDamageTime = 0.0f; + + // Initialize the dynamic material + InitializeDynamicMaterial(); } void ASpaceshipPawn::Tick(float DeltaTime) @@ -486,41 +489,54 @@ float ASpaceshipPawn::TakeDamage(float DamageAmount, FDamageEvent const& DamageE return DamageToApply; } +void ASpaceshipPawn::InitializeDynamicMaterial() +{ + if (ShipMesh) + { + // Store the original material + OriginalMaterial = ShipMesh->GetMaterial(0); + + if (OriginalMaterial) + { + // Create dynamic material instance only once + DynamicMaterialInstance = UMaterialInstanceDynamic::Create(OriginalMaterial, this); + if (DynamicMaterialInstance) + { + // Apply the dynamic material instance to the mesh + ShipMesh->SetMaterial(0, DynamicMaterialInstance); + + // Initialize flash color to transparent + DynamicMaterialInstance->SetVectorParameterValue("FlashColor", FLinearColor(0.0f, 0.0f, 0.0f, 0.0f)); + } + } + } +} + void ASpaceshipPawn::ApplyDamageFlash() { - // Apply material flash effect to indicate damage - if (ShipMesh && ShipMesh->GetMaterial(0)) + // Only set the flash color if we have a valid dynamic material instance + if (DynamicMaterialInstance) { - UMaterialInstanceDynamic* DynamicMaterial = UMaterialInstanceDynamic::Create(ShipMesh->GetMaterial(0), this); - if (DynamicMaterial) - { - // Assuming the material has a parameter named "FlashColor" - DynamicMaterial->SetVectorParameterValue("FlashColor", DamageFlashColor); - ShipMesh->SetMaterial(0, DynamicMaterial); + // Set the flash color + DynamicMaterialInstance->SetVectorParameterValue("FlashColor", DamageFlashColor); - // Set timer to reset the flash - GetWorldTimerManager().SetTimer( - DamageFlashTimerHandle, - this, - &ASpaceshipPawn::ResetDamageFlash, - DamageFlashDuration, - false - ); - } + // Set timer to reset the flash + GetWorldTimerManager().SetTimer( + DamageFlashTimerHandle, + this, + &ASpaceshipPawn::ResetDamageFlash, + DamageFlashDuration, + false + ); } } void ASpaceshipPawn::ResetDamageFlash() { - // Reset material flash effect - if (ShipMesh && ShipMesh->GetMaterial(0)) + // Reset the flash color only if we have a valid dynamic material instance + if (DynamicMaterialInstance) { - UMaterialInstanceDynamic* DynamicMaterial = Cast(ShipMesh->GetMaterial(0)); - if (DynamicMaterial) - { - // Reset the flash color (assuming transparent black means no flash) - DynamicMaterial->SetVectorParameterValue("FlashColor", FLinearColor(0.0f, 0.0f, 0.0f, 0.0f)); - } + DynamicMaterialInstance->SetVectorParameterValue("FlashColor", FLinearColor(0.0f, 0.0f, 0.0f, 0.0f)); } } diff --git a/Source/MyProject3/SpaceshipPawn.h b/Source/MyProject3/SpaceshipPawn.h index 7f6e1d1..2140836 100644 --- a/Source/MyProject3/SpaceshipPawn.h +++ b/Source/MyProject3/SpaceshipPawn.h @@ -176,6 +176,14 @@ protected: UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effects") FLinearColor DamageFlashColor = FLinearColor(1.0f, 0.0f, 0.0f, 0.5f); + // Store the original material + UPROPERTY() + UMaterialInterface* OriginalMaterial; + + // Store the dynamic material instance + UPROPERTY() + UMaterialInstanceDynamic* DynamicMaterialInstance; + private: // Movement state float CurrentThrottleInput; @@ -213,6 +221,9 @@ private: FTimerHandle DamageFlashTimerHandle; float LastDamageTime; + // Initialize dynamic material + void InitializeDynamicMaterial(); + void StartShieldRecharge(); void RechargeShield(); bool IsDead() const { return CurrentHealth <= 0.0f; }