89 virtual void OnLaunched(AActor* LauncherOwner,
const FVector& InStart,
const FVector& InDirectionOrTarget);
90 bool OverridePendingLaunchPath(
const FVector& InStart,
const FVector& InDirectionOrTarget);
91 void SetMeshWorldRotation(
const FRotator& WorldRotation);
94 virtual void OnCollided(
const AActor* HitTarget,
const FHitResult& Hit) { }
96 virtual void Tick(
float DeltaSeconds)
override;
99 UFUNCTION(BlueprintPure, Category =
"Projectile")
102 return CurrentProjectileState;
105 UFUNCTION(BlueprintPure, Category =
"Projectile")
106 FORCEINLINE
float GetElapsedTimeSinceLaunch()
const
108 return GetWorld()->GetTimeSeconds() - LaunchTime;
111 UFUNCTION(BlueprintPure, Category =
"Projectile")
112 FORCEINLINE
float GetFinishTime()
const
114 return GetWorld()->GetTimeSeconds() - FinishTime;
117 UFUNCTION(BlueprintPure, Category =
"Projectile")
118 FORCEINLINE UProjectilePilotComponent* GetProjectilePilotComponent()
const
120 return ProjectilePilotComponent;
123 UFUNCTION(BlueprintPure, Category =
"Projectile")
124 FORCEINLINE AActor* GetShootOwner()
const
129 UFUNCTION(BlueprintPure, Category =
"Projectile")
130 FORCEINLINE
bool IsLaunched()
const
135 UFUNCTION(BlueprintPure, Category =
"Projectile")
136 FORCEINLINE
bool ShootOwnerIsValid()
const
138 return ShootOwner.Get() !=
nullptr;
142 virtual void BeginPlay()
override;
143 virtual void OnSpawnFromPool_Implementation()
override;
144 virtual void OnReturnToPool_Implementation()
override;
145 void ApplyPawnCollisionResponse()
const;
148 UFUNCTION(BlueprintPure, Category=
"Projectile")
149 virtual FTransform GetCollisionParticleTransform(const AActor* OtherActor, const FHitResult& Hit)
const
151 return FTransform(Hit.ImpactNormal.Rotation(), Hit.ImpactPoint);
156 void OnProcessCollision(AActor* SelfActor, AActor* OtherActor, FVector NormalImpulse, const FHitResult& Hit);
159 void OnExplosionEffectFinished(UNiagaraComponent* NiagaraComponent);
162 void OnDeactivationProcessingFinished();
165 void FinalizeProjectileState(const FVector ImpactPoint, const AActor* Terminator,
EProjectileFinishReason FinishReason);
167 void ResetMeshRotation();
169 void UpdateProjectileRotation(
float DeltaTime);
172 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation")
175 UPROPERTY(BlueprintAssignable, Category = "Projectile")
176 FProjectileLaunchedDelegate OnProjectileLaunchedDelegate;
178 UPROPERTY(BlueprintAssignable, Category = "Projectile")
179 FProjectileFinishedDelegate OnProjectileFinishedDelegate;
181 UPROPERTY(BlueprintAssignable, Category = "Projectile")
182 FProjectileCollidedDelegate OnProjectileCollidedDelegate;
184 UPROPERTY(BlueprintAssignable, Category = "Projectile")
185 FProjectileDeactivatedDelegate OnProjectileDeactivatedDelegate;
188 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation", meta = (EditCondition = "DeactivationOption ==
EProjectileDeactivationOption::
Delay", EditConditionHides))
189 float DeactivationDelay = 0.0f;
191 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation", meta = (EditCondition = "DeactivationOption ==
EProjectileDeactivationOption::
Sequencer", EditConditionHides))
192 TObjectPtr<ULevelSequence> DeactivationSequencer;
195 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile")
196 TObjectPtr<UProjectilePilotComponent> ProjectilePilotComponent;
198 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile")
199 TObjectPtr<UStaticMeshComponent> MeshComponent;
201 UPROPERTY(EditDefaultsOnly, Category = "Projectile|Visual")
204 UPROPERTY(EditDefaultsOnly, Category = "Projectile|Visual", meta = (EditCondition = "MeshRotationMode ==
EProjectileMeshRotationMode::RotationRate", EditConditionHides))
205 FRotator MeshRotationRate = FRotator::ZeroRotator;
208 UPROPERTY(EditDefaultsOnly, Category = "Projectile|
Collision")
209 bool bCollideWithPawn = false;
212 UPROPERTY(Transient, BlueprintReadOnly, Category = "Projectile")
213 TObjectPtr<AActor> ShootOwner;
216 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
219 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
220 float LaunchTime = 0.0f;
222 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
223 float FinishTime = 0.0f;
226 FRotator InitialMeshRotation = FRotator::ZeroRotator;
227 FVector PendingLaunchStart = FVector::ZeroVector;
228 FVector PendingLaunchDirectionOrTarget = FVector::ZeroVector;
229 bool bHasPendingLaunchPath = false;
231 FTimerHandle DeactivationTimerHandle;