Add Camera Shake when player is damaged
This commit is contained in:
		
							parent
							
								
									c9c128ba44
								
							
						
					
					
						commit
						9ddc4c9ace
					
				
							
								
								
									
										
											BIN
										
									
								
								Content/Player/BP_PlayerCharacter.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Content/Player/BP_PlayerCharacter.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								Content/Player/C_Shake.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Content/Player/C_Shake.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @ -29,6 +29,16 @@ APlayerCharacter::APlayerCharacter() | |||||||
| 	HealthBarWidgetComponent->SetTwoSided(true); | 	HealthBarWidgetComponent->SetTwoSided(true); | ||||||
| 	HealthBarWidgetComponent->SetBackgroundColor(FLinearColor(1, 1, 1, 0)); | 	HealthBarWidgetComponent->SetBackgroundColor(FLinearColor(1, 1, 1, 0)); | ||||||
| 	HealthBarWidgetComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); | 	HealthBarWidgetComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); | ||||||
|  | 
 | ||||||
|  | 	CameraShakeTimelineComponent = CreateDefaultSubobject<UTimelineComponent>(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() | void APlayerCharacter::BeginPlay() | ||||||
| @ -37,6 +47,14 @@ void APlayerCharacter::BeginPlay() | |||||||
| 
 | 
 | ||||||
| 	GetHealthComponent()->OnDamaged.AddDynamic(this, &APlayerCharacter::OnDamaged); | 	GetHealthComponent()->OnDamaged.AddDynamic(this, &APlayerCharacter::OnDamaged); | ||||||
| 	GetHealthComponent()->OnDeath.AddDynamic(this, &APlayerCharacter::OnDeath); | 	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) | void APlayerCharacter::Tick(float DeltaTime) | ||||||
| @ -78,11 +96,7 @@ void APlayerCharacter::OnDamaged(FDamageInfo damageInfo) | |||||||
| 		UGameplayStatics::PlaySoundAtLocation(GetWorld(), OnDamagedSound, GetActorLocation()); | 		UGameplayStatics::PlaySoundAtLocation(GetWorld(), OnDamagedSound, GetActorLocation()); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	APlayerController* playerController = UGameplayStatics::GetPlayerController(this, 0); | 	CameraShakeTimelineComponent->PlayFromStart(); | ||||||
| 	if (playerController && CameraShake) |  | ||||||
| 	{ |  | ||||||
| 		playerController->ClientStartCameraShake(CameraShake); |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void APlayerCharacter::OnDeath(FDamageInfo damageInfo) | void APlayerCharacter::OnDeath(FDamageInfo damageInfo) | ||||||
| @ -94,3 +108,17 @@ void APlayerCharacter::OnDeath(FDamageInfo damageInfo) | |||||||
| 
 | 
 | ||||||
| 	// TODO: End the game
 | 	// 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); | ||||||
|  | } | ||||||
|  | |||||||
| @ -4,8 +4,10 @@ | |||||||
| 
 | 
 | ||||||
| #include "CoreMinimal.h" | #include "CoreMinimal.h" | ||||||
| #include "VampireCharacter.h" | #include "VampireCharacter.h" | ||||||
|  | #include "Components/TimelineComponent.h" | ||||||
| #include "PlayerCharacter.generated.h" | #include "PlayerCharacter.generated.h" | ||||||
| 
 | 
 | ||||||
|  | struct FDamageInfo; | ||||||
| struct FInputActionInstance; | struct FInputActionInstance; | ||||||
| class UWidgetComponent; | class UWidgetComponent; | ||||||
| class UWeaponInventoryComponent; | class UWeaponInventoryComponent; | ||||||
| @ -32,11 +34,25 @@ public: | |||||||
| 	UPROPERTY(EditAnywhere) | 	UPROPERTY(EditAnywhere) | ||||||
| 	UWidgetComponent* HealthBarWidgetComponent; | 	UWidgetComponent* HealthBarWidgetComponent; | ||||||
| 
 | 
 | ||||||
|  | 	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly) | ||||||
|  | 	TObjectPtr<UTimelineComponent> CameraShakeTimelineComponent = nullptr; | ||||||
|  | 	 | ||||||
| 	UPROPERTY(EditAnywhere) | 	UPROPERTY(EditAnywhere) | ||||||
| 	TSubclassOf<UCameraShakeBase> CameraShake; | 	TObjectPtr<UCurveFloat> CameraShakeCurve; | ||||||
|  | 
 | ||||||
|  | 	UPROPERTY(EditAnywhere) | ||||||
|  | 	float CameraShakeStrength = 100.0f; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	 | ||||||
|  | 	TObjectPtr<APlayerCameraManager> PlayerCameraManager = nullptr; | ||||||
| 	 | 	 | ||||||
| 	APlayerCharacter(); | 	APlayerCharacter(); | ||||||
| 
 | 
 | ||||||
|  | private: | ||||||
|  | 	FOnTimelineFloat onTimelineCallback; | ||||||
|  | 	FOnTimelineEventStatic onTimelineFinishedCallback; | ||||||
|  | 
 | ||||||
| protected: | protected: | ||||||
| 	virtual void BeginPlay() override; | 	virtual void BeginPlay() override; | ||||||
| 
 | 
 | ||||||
| @ -53,4 +69,10 @@ private: | |||||||
| 
 | 
 | ||||||
| 	UFUNCTION() | 	UFUNCTION() | ||||||
| 	virtual void OnDeath(FDamageInfo damageInfo); | 	virtual void OnDeath(FDamageInfo damageInfo); | ||||||
|  | 
 | ||||||
|  | 	UFUNCTION() | ||||||
|  | 	void CameraShakeTimelineCallback(float val); | ||||||
|  | 
 | ||||||
|  | 	UFUNCTION() | ||||||
|  | 	void CameraShakeTimelineFinishedCallback(); | ||||||
| }; | }; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user