25{
26 Super::Notify(MeshComp, Animation, EventReference);
27
28 if (!MeshComp)
29 {
30 return;
31 }
32
33 AActor* MeshOwner = MeshComp->GetOwner();
34 if (!MeshOwner)
35 {
36 return;
37 }
38
40 {
41 UWorld* World = MeshComp->GetWorld();
42 check(World);
43
44 const FVector FootLocation = MeshComp->GetSocketLocation(
FootSocketName);
45 const FRotator FootRotation = MeshComp->GetSocketRotation(
FootSocketName);
46 const FVector TraceEnd = FootLocation - MeshOwner->GetActorUpVector() *
TraceLength;
47
49
50 if (UKismetSystemLibrary::LineTraceSingle(MeshOwner , FootLocation, TraceEnd,
TraceChannel,
true , MeshOwner->Children,
52 {
53 if (!
Hit.PhysMaterial.Get())
54 {
55 return;
56 }
57
58 const EPhysicalSurface SurfaceType =
Hit.PhysMaterial.Get()->SurfaceType;
59
60 check(IsInGameThread());
61 checkNoRecursion();
62 static TArray<FALSHitFX*> HitFXRows;
63 HitFXRows.Reset();
64
66
68 if (
auto FoundResult = HitFXRows.FindByPredicate([&](
const FALSHitFX* Value)
69 {
70 return SurfaceType == Value->SurfaceType;
71 }))
72 {
73 HitFX = *FoundResult;
74 }
75 else if (
auto DefaultResult = HitFXRows.FindByPredicate([&](
const FALSHitFX* Value)
76 {
77 return EPhysicalSurface::SurfaceType_Default == Value->SurfaceType;
78 }))
79 {
80 HitFX = *DefaultResult;
81 }
82 else
83 {
84 return;
85 }
86
88 {
89 UAudioComponent* SpawnedSound = nullptr;
90
91 const float MaskCurveValue = MeshComp->GetAnimInstance()->GetCurveValue(
96
97 switch (HitFX->SoundSpawnType)
98 {
100 SpawnedSound = UGameplayStatics::SpawnSoundAtLocation(
101 World, HitFX->Sound.Get(),
Hit.Location + HitFX->SoundLocationOffset,
103 break;
104
106 SpawnedSound = UGameplayStatics::SpawnSoundAttached(HitFX->Sound.Get(), MeshComp,
FootSocketName,
107 HitFX->SoundLocationOffset,
108 HitFX->SoundRotationOffset,
109 HitFX->SoundAttachmentType, true, FinalVolMult,
111
112 break;
113 }
114 if (SpawnedSound)
115 {
117 }
118 }
119
121 {
122 UNiagaraComponent* SpawnedParticle = nullptr;
123 const FVector
Location =
Hit.Location + MeshOwner->GetTransform().TransformVector(
124 HitFX->DecalLocationOffset);
125
126 switch (HitFX->NiagaraSpawnType)
127 {
129 SpawnedParticle = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
130 World, HitFX->NiagaraSystem.Get(),
Location, FootRotation + HitFX->NiagaraRotationOffset);
131 break;
132
134 SpawnedParticle = UNiagaraFunctionLibrary::SpawnSystemAttached(
135 HitFX->NiagaraSystem.Get(), MeshComp,
FootSocketName, HitFX->NiagaraLocationOffset,
136 HitFX->NiagaraRotationOffset, HitFX->NiagaraAttachmentType, true);
137 break;
138 }
139 }
140
141 if (
bSpawnDecal && HitFX->DecalMaterial.LoadSynchronous())
142 {
143 const FVector
Location =
Hit.Location + MeshOwner->GetTransform().TransformVector(
144 HitFX->DecalLocationOffset);
145
146 const FVector DecalSize = FVector(
bMirrorDecalX ? -HitFX->DecalSize.X : HitFX->DecalSize.
X,
149
150 UDecalComponent* SpawnedDecal = nullptr;
151 switch (HitFX->DecalSpawnType)
152 {
154 SpawnedDecal = UGameplayStatics::SpawnDecalAtLocation(
155 World, HitFX->DecalMaterial.Get(), DecalSize,
Location,
156 FootRotation + HitFX->DecalRotationOffset, HitFX->DecalLifeSpan);
157 break;
158
160 SpawnedDecal = UGameplayStatics::SpawnDecalAttached(HitFX->DecalMaterial.Get(), DecalSize,
162 FootRotation + HitFX->DecalRotationOffset,
163 HitFX->DecalAttachmentType,
164 HitFX->DecalLifeSpan);
165 break;
166 }
167 }
168 }
169 }
170}
Definition ALSCharacterStructLibrary.h:272