-
Notifications
You must be signed in to change notification settings - Fork 0
/
FootStepNotify.cpp
83 lines (74 loc) · 2.93 KB
/
FootStepNotify.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Bu Notify sınıfı, animasyon blueprint'inde ayak sesi ve parçacık efekti oluşturmak için kullanılır.
/**
@ Thyke
*/
#include "FootStepNotify.h"
#include "Sound/SoundCue.h"
#include <Kismet/GameplayStatics.h>
#include "PhysicalMaterials/PhysicalMaterial.h"
#include "NiagaraFunctionLibrary.h"
#include "NiagaraComponent.h"
UFootStepNotify::UFootStepNotify()
{
}
void UFootStepNotify::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation)
{
if (!MeshComp || !Animation)
{
return;
}
LineTraceFootstepSoundAndParticles(MeshComp);
}
void UFootStepNotify::PlaySoundAndSpawnParticles(USkeletalMeshComponent* MeshComp, USoundBase* SoundCue, UNiagaraSystem* NiagaraSystem, FVector Location)
{
if (SoundCue)
{
UGameplayStatics::PlaySoundAtLocation(MeshComp, SoundCue, Location);
}
if (NiagaraSystem)
{
UNiagaraFunctionLibrary::SpawnSystemAtLocation(MeshComp->GetWorld(), NiagaraSystem, Location);
}
}
void UFootStepNotify::LineTraceFootstepSoundAndParticles(USkeletalMeshComponent* MeshComp)
{
// Mesh component'in sahibi olan karakter alınır
AActor* Owner = MeshComp->GetOwner();
// Eğer sahibi yoksa, işlem sonlandırılır
if (Owner == nullptr)
{
return;
}
// Skeletal mesh'in socket pozisyonu alınır(foot_l_socket gibi)
FVector SocketLocation = MeshComp->GetSocketLocation(FootSocketName);
// Line trace için hedef pozisyonu ayarla (socket pozisyonunun 50 birim altında, bu değeri artırabiliriz.)
FVector TargetLocation = SocketLocation - FVector(0, 0, 50.0f);
// Line trace için çarpışma sorgusu parametreleri ayarla
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(Owner);
QueryParams.bTraceComplex = false;
QueryParams.bReturnPhysicalMaterial = true;
// Socket pozisyonundan hedef pozisyona line trace yap
// Eğer çarpışma olursa, çarpışma bilgilerini HitResult değişkenine ata
FHitResult HitResult;
bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, SocketLocation, TargetLocation, ECC_Visibility, QueryParams);
if (bHit)
{
UPhysicalMaterial* PhysMaterial = HitResult.PhysMaterial.Get();
EPhysicalSurface SurfaceType = SurfaceType_Default;
if (PhysMaterial)
{
SurfaceType = UPhysicalMaterial::DetermineSurfaceType(PhysMaterial);
// Loop through SurfaceData array to find a matching surface
for (const FSurfaceData& SurfaceData : SurfaceDataTable)
{
if (SurfaceData.SurfaceType == SurfaceType)
{
// Play corresponding sound and spawn particles
PlaySoundAndSpawnParticles(MeshComp, SurfaceData.SoundCue, SurfaceData.NiagaraSystem, HitResult.Location);
break;
}
}
}
}
}