diff --git a/Content/Player/BP_PlayerCharacter.uasset b/Content/Player/BP_PlayerCharacter.uasset index 8d361ec..12e1040 100644 --- a/Content/Player/BP_PlayerCharacter.uasset +++ b/Content/Player/BP_PlayerCharacter.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:16fca7e0707027115a6bd0a4c4145828955ae8fc1d42b9a73d63ee28f14e5a2f -size 56951 +oid sha256:a3ac3318d39ce2351d33929436fd0603e75f89dc25609f27a534a172ab72bbd5 +size 56651 diff --git a/Content/Player/C_Shake.uasset b/Content/Player/C_Shake.uasset new file mode 100644 index 0000000..e91ad82 --- /dev/null +++ b/Content/Player/C_Shake.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64c15119985da32f805111a115b5f7bee3337ca4551db599aa944ec9941e280c +size 4854 diff --git a/Source/vampires/PlayerCharacter.cpp b/Source/vampires/PlayerCharacter.cpp index 5ca7ae6..512a2f4 100644 --- a/Source/vampires/PlayerCharacter.cpp +++ b/Source/vampires/PlayerCharacter.cpp @@ -29,6 +29,16 @@ APlayerCharacter::APlayerCharacter() HealthBarWidgetComponent->SetTwoSided(true); HealthBarWidgetComponent->SetBackgroundColor(FLinearColor(1, 1, 1, 0)); HealthBarWidgetComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + CameraShakeTimelineComponent = CreateDefaultSubobject(TEXT("Camera Shake Timeline Component")); + CameraShakeTimelineComponent->SetDirectionPropertyName(FName("TimelineDirection")); + CameraShakeTimelineComponent->SetLooping(false); + CameraShakeTimelineComponent->SetTimelineLength(0.5f); + CameraShakeTimelineComponent->SetTimelineLengthMode(TL_TimelineLength); + CameraShakeTimelineComponent->SetPlaybackPosition(0.0f, false); + + onTimelineCallback.BindUFunction(this, FName(TEXT("CameraShakeTimelineCallback"))); + onTimelineFinishedCallback.BindUFunction(this, FName(TEXT("CameraShakeTimelineFinishedCallback"))); } void APlayerCharacter::BeginPlay() @@ -37,6 +47,14 @@ void APlayerCharacter::BeginPlay() GetHealthComponent()->OnDamaged.AddDynamic(this, &APlayerCharacter::OnDamaged); GetHealthComponent()->OnDeath.AddDynamic(this, &APlayerCharacter::OnDeath); + + if (CameraShakeCurve != nullptr) + { + CameraShakeTimelineComponent->AddInterpFloat(CameraShakeCurve, onTimelineCallback); + CameraShakeTimelineComponent->SetTimelineFinishedFunc(onTimelineFinishedCallback); + } + + PlayerCameraManager = GetWorld()->GetFirstPlayerController()->PlayerCameraManager; } void APlayerCharacter::Tick(float DeltaTime) @@ -78,11 +96,7 @@ void APlayerCharacter::OnDamaged(FDamageInfo damageInfo) UGameplayStatics::PlaySoundAtLocation(GetWorld(), OnDamagedSound, GetActorLocation()); } - APlayerController* playerController = UGameplayStatics::GetPlayerController(this, 0); - if (playerController && CameraShake) - { - playerController->ClientStartCameraShake(CameraShake); - } + CameraShakeTimelineComponent->PlayFromStart(); } void APlayerCharacter::OnDeath(FDamageInfo damageInfo) @@ -94,3 +108,17 @@ void APlayerCharacter::OnDeath(FDamageInfo damageInfo) // TODO: End the game } + +void APlayerCharacter::CameraShakeTimelineCallback(float val) +{ + auto PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0); + auto cameraActor = PlayerController->GetViewTarget(); + cameraActor->SetActorLocation(FVector(FMath::RandRange(0.0f, CameraShakeStrength) * val, FMath::RandRange(0.0f, CameraShakeStrength) * val, 0.0f)); +} + +void APlayerCharacter::CameraShakeTimelineFinishedCallback() +{ + auto PlayerController = UGameplayStatics::GetPlayerController(GetWorld(), 0); + auto cameraActor = PlayerController->GetViewTarget(); + cameraActor->SetActorLocation(FVector::ZeroVector); +} diff --git a/Source/vampires/PlayerCharacter.h b/Source/vampires/PlayerCharacter.h index f7e173e..583cc65 100644 --- a/Source/vampires/PlayerCharacter.h +++ b/Source/vampires/PlayerCharacter.h @@ -4,8 +4,10 @@ #include "CoreMinimal.h" #include "VampireCharacter.h" +#include "Components/TimelineComponent.h" #include "PlayerCharacter.generated.h" +struct FDamageInfo; struct FInputActionInstance; class UWidgetComponent; class UWeaponInventoryComponent; @@ -32,11 +34,25 @@ public: UPROPERTY(EditAnywhere) UWidgetComponent* HealthBarWidgetComponent; + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) + TObjectPtr CameraShakeTimelineComponent = nullptr; + UPROPERTY(EditAnywhere) - TSubclassOf CameraShake; + TObjectPtr CameraShakeCurve; + UPROPERTY(EditAnywhere) + float CameraShakeStrength = 100.0f; + +private: + + TObjectPtr PlayerCameraManager = nullptr; + APlayerCharacter(); +private: + FOnTimelineFloat onTimelineCallback; + FOnTimelineEventStatic onTimelineFinishedCallback; + protected: virtual void BeginPlay() override; @@ -53,4 +69,10 @@ private: UFUNCTION() virtual void OnDeath(FDamageInfo damageInfo); + + UFUNCTION() + void CameraShakeTimelineCallback(float val); + + UFUNCTION() + void CameraShakeTimelineFinishedCallback(); };