diff --git a/Content/Player/CPlayerCharacter_BP.uasset b/Content/Player/CPlayerCharacter_BP.uasset index 78aa692..e3dcebf 100644 --- a/Content/Player/CPlayerCharacter_BP.uasset +++ b/Content/Player/CPlayerCharacter_BP.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84e458ba9629c1d92b00c9e939804842120a43af958a0906522da6c0bbc59cf1 +oid sha256:139dcf5aa31fc2f3b52c2c88a357a93422f8258ed6c90af1e0b5bba65aeb80e2 size 83596 diff --git a/Source/Crunch/Private/Character/CCharacter.cpp b/Source/Crunch/Private/Character/CCharacter.cpp index 9d16e4f..8566d7e 100644 --- a/Source/Crunch/Private/Character/CCharacter.cpp +++ b/Source/Crunch/Private/Character/CCharacter.cpp @@ -18,6 +18,7 @@ void ACCharacter::BeginPlay() { Super::BeginPlay(); ConfigureOverHeadStatusWidget(); + MeshRelativeTransform = GetMesh()->GetRelativeTransform(); } ACCharacter::ACCharacter() @@ -145,10 +146,39 @@ void ACCharacter::PlayDeathAnimation() { if (DeathMontage) { - PlayAnimMontage(DeathMontage); + const auto MontageDuration {PlayAnimMontage(DeathMontage)}; + GetWorldTimerManager().SetTimer( + DeathMontageTimerHandle, + this, + &ThisClass::DeathMontageFinished, + MontageDuration + DeathMontageFinishTimeShift + ); } } +void ACCharacter::DeathMontageFinished() +{ + SetRagdollEnabled(true); +} + +void ACCharacter::SetRagdollEnabled(bool bIsEnabled) +{ + if (bIsEnabled) + { + GetMesh()->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform); + GetMesh()->SetSimulatePhysics(true); + GetMesh()->SetCollisionEnabled(ECollisionEnabled::PhysicsOnly); + } + else + { + GetMesh()->SetSimulatePhysics(false); + GetMesh()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + GetMesh()->AttachToComponent(GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform); + GetMesh()->SetRelativeTransform(MeshRelativeTransform); + } +} + + void ACCharacter::StartDeathSequence() { OnDead(); @@ -162,6 +192,7 @@ void ACCharacter::StartDeathSequence() void ACCharacter::ReSpawn() { OnRespawn(); + SetRagdollEnabled(false); GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); GetCharacterMovement()->SetMovementMode(MOVE_Walking); GetMesh()->GetAnimInstance()->StopAllMontages(0.f); diff --git a/Source/Crunch/Public/Character/CCharacter.h b/Source/Crunch/Public/Character/CCharacter.h index 762bfb2..f42c341 100644 --- a/Source/Crunch/Public/Character/CCharacter.h +++ b/Source/Crunch/Public/Character/CCharacter.h @@ -62,9 +62,16 @@ private: /********************************************************************************************/ /* Death & Respawning */ /********************************************************************************************/ + FTransform MeshRelativeTransform; + UPROPERTY(EditDefaultsOnly, Category="Death") + float DeathMontageFinishTimeShift { -0.8f }; UPROPERTY(EditDefaultsOnly, Category="Death") TObjectPtr DeathMontage; + FTimerHandle DeathMontageTimerHandle; + void DeathMontageFinished(); + void SetRagdollEnabled(bool bIsEnabled); + void PlayDeathAnimation(); void StartDeathSequence();