본문 바로가기

Unreal/언리얼 엔진 5로 개발하는 멀티플레이어 게임(Book)

[Unreal] US_MinionSpawner.cpp 코드 분석

미니언 스포너 초기화

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()를 사용할 때 들어가는 변수로, 현재는 다른 오브젝트와 충돌을 피하면서 액터를 스폰하도록 설정되어 있다. 이를 통해 스폰 시의 충돌 문제를 방지할 수 있다.