Payback 0.0.1
CK Graduation Project
로딩중...
검색중...
일치하는것 없음
ProjectileBase.h
이 파일의 문서화 페이지로 가기
1// Fill out your copyright notice in the Description page of Project Settings.
2
3#pragma once
4
5#include "CK_UE.h"
6#include "GameFramework/Actor.h"
9#include "ProjectileBase.generated.h"
10
11class UNiagaraComponent;
12class UNiagaraSystem;
13class UProjectilePilotComponent;
14class ULevelSequence;
15class ULevelSequencePlayer;
16
17
18UENUM(BlueprintType)
19enum class EProjectileState : uint8
20{
27};
28
29UENUM(BlueprintType)
37
38UENUM(BlueprintType)
40{
42 Manual,
43 Delay,
45};
46
47UENUM()
49{
50 None UMETA(DisplayName = "회전 안 함"),
51 RotationRate UMETA(DisplayName = "회전 속도"),
52 FaceVelocity UMETA(DisplayName = "진행 방향 바라보기")
53};
54
55
56DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FProjectileFinishedDelegate, const AProjectileBase*, Projectile, const EProjectileFinishReason, FinishReason, const AActor*, Terminator);
57
58DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FProjectileCollidedDelegate, AActor*, SelfActor, AActor*, OtherActor, FVector, NormalImpulse, const FHitResult&, Hit);
59
60DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FProjectileDeactivatedDelegate, AProjectileBase*, Projectile, const EProjectileDeactivationOption, Option);
61
62DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FProjectileLaunchedDelegate, const AProjectileBase*, Projectile);
63
64
65UCLASS()
66class CK_UE_API UCollisionUserData : public UAssetUserData
67{
68 GENERATED_BODY()
69
70public:
71 UPROPERTY(Transient)
72 TWeakObjectPtr<AActor> CachedTerminator;
73
74 UPROPERTY(Transient)
75 FVector CachedImpactPoint = FVector::ZeroVector;
76};
77
78
79UCLASS(Abstract, BlueprintType)
80class CK_UE_API AProjectileBase : public AActor, public IObjectPoolingInterface
81{
82 GENERATED_BODY()
83
84public:
86
87public:
88 virtual void ForceEarlyFinish(const AActor* Terminator, const EProjectileFinishReason FinishReason);
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);
92
93 virtual void OnFinished(const FVector TerminatedPosition, const AActor* Terminator, EProjectileFinishReason FinishReason) { }
94 virtual void OnCollided(const AActor* HitTarget, const FHitResult& Hit) { }
95 virtual void OnInFlight(const float DeltaTime) { }
96 virtual void Tick(float DeltaSeconds) override;
97
98public:
99 UFUNCTION(BlueprintPure, Category = "Projectile")
100 FORCEINLINE EProjectileState GetProjectileState() const
101 {
102 return CurrentProjectileState;
103 }
104
105 UFUNCTION(BlueprintPure, Category = "Projectile")
106 FORCEINLINE float GetElapsedTimeSinceLaunch() const
107 {
108 return GetWorld()->GetTimeSeconds() - LaunchTime;
109 }
110
111 UFUNCTION(BlueprintPure, Category = "Projectile")
112 FORCEINLINE float GetFinishTime() const
113 {
114 return GetWorld()->GetTimeSeconds() - FinishTime;
115 }
116
117 UFUNCTION(BlueprintPure, Category = "Projectile")
118 FORCEINLINE UProjectilePilotComponent* GetProjectilePilotComponent() const
119 {
120 return ProjectilePilotComponent;
121 }
122
123 UFUNCTION(BlueprintPure, Category = "Projectile")
124 FORCEINLINE AActor* GetShootOwner() const
125 {
126 return ShootOwner;
127 }
128
129 UFUNCTION(BlueprintPure, Category = "Projectile")
130 FORCEINLINE bool IsLaunched() const
131 {
132 return CurrentProjectileState == EProjectileState::Launched;
133 }
134
135 UFUNCTION(BlueprintPure, Category = "Projectile")
136 FORCEINLINE bool ShootOwnerIsValid() const
137 {
138 return ShootOwner.Get() != nullptr;
139 }
140
141protected:
142 virtual void BeginPlay() override;
143 virtual void OnSpawnFromPool_Implementation() override;
144 virtual void OnReturnToPool_Implementation() override;
145 void ApplyPawnCollisionResponse() const;
146
147protected:
148 UFUNCTION(BlueprintPure, Category="Projectile")
149 virtual FTransform GetCollisionParticleTransform(const AActor* OtherActor, const FHitResult& Hit) const
150 {
151 return FTransform(Hit.ImpactNormal.Rotation(), Hit.ImpactPoint);
152 }
153
154private:
155 UFUNCTION()
156 void OnProcessCollision(AActor* SelfActor, AActor* OtherActor, FVector NormalImpulse, const FHitResult& Hit);
157
158 UFUNCTION()
159 void OnExplosionEffectFinished(UNiagaraComponent* NiagaraComponent);
160
161 UFUNCTION()
162 void OnDeactivationProcessingFinished();
163
164 UFUNCTION()
165 void FinalizeProjectileState(const FVector ImpactPoint, const AActor* Terminator, EProjectileFinishReason FinishReason);
166
167 void ResetMeshRotation();
168
169 void UpdateProjectileRotation(float DeltaTime);
170
171public:
172 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation")
174
175 UPROPERTY(BlueprintAssignable, Category = "Projectile")
176 FProjectileLaunchedDelegate OnProjectileLaunchedDelegate;
177
178 UPROPERTY(BlueprintAssignable, Category = "Projectile")
179 FProjectileFinishedDelegate OnProjectileFinishedDelegate;
180
181 UPROPERTY(BlueprintAssignable, Category = "Projectile")
182 FProjectileCollidedDelegate OnProjectileCollidedDelegate;
183
184 UPROPERTY(BlueprintAssignable, Category = "Projectile")
185 FProjectileDeactivatedDelegate OnProjectileDeactivatedDelegate;
186
187protected:
188 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation", meta = (EditCondition = "DeactivationOption == EProjectileDeactivationOption::Delay", EditConditionHides))
189 float DeactivationDelay = 0.0f;
190
191 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile|Deactivation", meta = (EditCondition = "DeactivationOption == EProjectileDeactivationOption::Sequencer", EditConditionHides))
192 TObjectPtr<ULevelSequence> DeactivationSequencer;
193
194protected:
195 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile")
196 TObjectPtr<UProjectilePilotComponent> ProjectilePilotComponent;
197
198 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Projectile")
199 TObjectPtr<UStaticMeshComponent> MeshComponent;
200
201 UPROPERTY(EditDefaultsOnly, Category = "Projectile|Visual")
203
204 UPROPERTY(EditDefaultsOnly, Category = "Projectile|Visual", meta = (EditCondition = "MeshRotationMode == EProjectileMeshRotationMode::RotationRate", EditConditionHides))
205 FRotator MeshRotationRate = FRotator::ZeroRotator;
206
207 // true: Pawn과 충돌, false: Pawn을 무시하고 월드 지오메트리와 충돌
208 UPROPERTY(EditDefaultsOnly, Category = "Projectile|Collision")
209 bool bCollideWithPawn = false;
210
211protected:
212 UPROPERTY(Transient, BlueprintReadOnly, Category = "Projectile")
213 TObjectPtr<AActor> ShootOwner;
214
215private:
216 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
218
219 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
220 float LaunchTime = 0.0f;
221
222 UPROPERTY(BlueprintReadOnly, Category = "Projectile", meta = (AllowPrivateAccess = "true"))
223 float FinishTime = 0.0f;
224
225private:
226 FRotator InitialMeshRotation = FRotator::ZeroRotator;
227 FVector PendingLaunchStart = FVector::ZeroVector;
228 FVector PendingLaunchDirectionOrTarget = FVector::ZeroVector;
229 bool bHasPendingLaunchPath = false;
230
231 FTimerHandle DeactivationTimerHandle;
232};
static constexpr FGlobalUserSettingsRuntime None
Definition GlobalUserSettingsRuntime.cpp:6
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FProjectileFinishedDelegate, const AProjectileBase *, Projectile, const EProjectileFinishReason, FinishReason, const AActor *, Terminator)
EProjectileState
Definition ProjectileBase.h:20
EProjectileDeactivationOption
Definition ProjectileBase.h:40
DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FProjectileCollidedDelegate, AActor *, SelfActor, AActor *, OtherActor, FVector, NormalImpulse, const FHitResult &, Hit)
EProjectileFinishReason
Definition ProjectileBase.h:31
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FProjectileLaunchedDelegate, const AProjectileBase *, Projectile)
EProjectileMeshRotationMode
Definition ProjectileBase.h:49
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FProjectileDeactivatedDelegate, AProjectileBase *, Projectile, const EProjectileDeactivationOption, Option)
Definition ProjectileBase.h:81
virtual void OnFinished(const FVector TerminatedPosition, const AActor *Terminator, EProjectileFinishReason FinishReason)
Definition ProjectileBase.h:93
virtual void OnCollided(const AActor *HitTarget, const FHitResult &Hit)
Definition ProjectileBase.h:94
virtual void OnInFlight(const float DeltaTime)
Definition ProjectileBase.h:95
Definition ObjectPoolingInterface.h:18
Definition ProjectileBase.h:67