미니언 스포너 초기화
void AUS_MinionSpawner::BeginPlay()
{
Super::BeginPlay();
if (SpawnableMinions.IsEmpty())
return;
if (GetLocalRole() != ROLE_Authority)
return;
for (int32 i = 0; i < NumMinionsAtStart; i++)
{
Spawn();
}
GetWorldTimerManager().SetTimer(SpawnTimerHandle, this, &AUS_MinionSpawner::Spawn, SpawnDelay, true, SpawnDelay);
}
- GetWorldTimerManager().SetTimer()는 Tick()이 프레임마다 동작하는 것과 달리, 지정된 시간 간격으로 반복적으로 호출된다. 추가적으로 각 인자마다 설정할 수 있는데, 순서대로 FTimerHandle, UserClass* 객체, 반복 시간, 반복 호출 허용 여부, 시작 시간을 설정할 수 있다.
스폰
void AUS_MinionSpawner::Spawn()
{
FActorSpawnParameters SpawnParams;
SpawnParams.SpawnCollisionHandlingOverride =
ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButDontSpawnIfColliding;
auto Minion = SpawnableMinions[FMath::RandRange(0, SpawnableMinions.Num() - 1)];
const auto Rotation = FRotator(0.0f, FMath::RandRange(0.0f, 360.0f), 0.0f);
const auto Location = SpawnArea->GetComponentLocation() +
FVector(
FMath::RandRange(-SpawnArea->GetScaledBoxExtent().X, SpawnArea->GetScaledBoxExtent().X),
FMath::RandRange(-SpawnArea->GetScaledBoxExtent().Y, SpawnArea->GetScaledBoxExtent().Y),
0.0f);
GetWorld()->SpawnActor<AUS_Minion>(Minion, Location, Rotation, SpawnParams);
}
- SpawnableMinions[FMath::RandRange(0, SpawnableMinions.Num() - 1)]: 배열에 들어간 몬스터 중 랜덤으로 하나를 선택하는 방식이다.
- FActorSpawnParameters: SpawnActor()를 사용할 때 들어가는 변수로, 현재는 다른 오브젝트와 충돌을 피하면서 액터를 스폰하도록 설정되어 있다. 이를 통해 스폰 시의 충돌 문제를 방지할 수 있다.