-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMySpawnActor.cpp
More file actions
107 lines (89 loc) · 2.88 KB
/
MySpawnActor.cpp
File metadata and controls
107 lines (89 loc) · 2.88 KB
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "MySpawnActor.h"
#include "MySpawnActorParticle.h"
#include "MySpawnActorPhysics.h"
#include "MySpawnActorProjectile.h"
#include "Kismet/GameplayStatics.h"
// Sets default values
AMySpawnActor::AMySpawnActor()
{
PrimaryActorTick.bCanEverTick = false;
Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
#if WITH_EDITORONLY_DATA
Root->bVisualizeComponent = true;
#endif
RootComponent = Root;
}
void AMySpawnActor::SpawnActor_Implementation()
{
UE_LOG(LogTemp, Warning, TEXT("SpawnActor_Implementation"));
if (bSpawnPhysicsActor)
{
SpawnPhysicsActor();
}
else if (bSpawnProjectileActor)
{
SpawnProjectileActor();
}
else if (bSpawnParticleEffect)
{
SpawnParticleEffect();
}
}
void AMySpawnActor::SpawnPhysicsActor()
{
if (MySpawnActorPhysicsClass != nullptr)
{
UWorld* const World = GetWorld();
if (World != nullptr)
{
const FVector SpawnLocation = GetActorLocation();
// Set Rotation: Pitch and Yaw randomized to prevent perfect stacking.
const FRotator SpawnRotation = FRotator(FMath::RandRange(0.0f, 360.0f), 0.f, FMath::RandRange(0.0f, 360.0f));
FActorSpawnParameters ActorSpawnParams;
ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;
World->SpawnActor<AActor>(MySpawnActorPhysicsClass, SpawnLocation, SpawnRotation, ActorSpawnParams);
}
}
}
void AMySpawnActor::SpawnProjectileActor()
{
if (MySpawnActorProjectileClass != nullptr)
{
UWorld* const World = GetWorld();
if (World != nullptr)
{
const FVector SpawnLocation = GetActorLocation();
const FRotator SpawnRotation = GetActorRotation();
FActorSpawnParameters ActorSpawnParams;
ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;
World->SpawnActor<AActor>(MySpawnActorProjectileClass, SpawnLocation, SpawnRotation, ActorSpawnParams);
}
}
}
void AMySpawnActor::SpawnParticleEffect()
{
if (MySpawnActorParticleClass != nullptr)
{
UWorld* const World = GetWorld();
if (World != nullptr)
{
FTransform SpawnTransform(GetActorLocation());
FActorSpawnParameters ActorSpawnParams;
ActorSpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
AMySpawnActorParticle* MyDeferredActor = World->SpawnActorDeferred<AMySpawnActorParticle>(MySpawnActorParticleClass, SpawnTransform, nullptr, nullptr, ESpawnActorCollisionHandlingMethod::AlwaysSpawn);
if (MyDeferredActor)
{
// We can now access class variables before spawning
MyDeferredActor->ParticleColor = RandomColor();
UGameplayStatics::FinishSpawningActor(MyDeferredActor, SpawnTransform);
}
}
}
}
FVector AMySpawnActor::RandomColor()
{
float Red = FMath::RandRange(0.f, 1.f);
float Blue = FMath::RandRange(0.f, 1.f);
float Green = FMath::RandRange(0.f, 1.f);
return FVector(Red, Blue, Green);
}