본문 바로가기
언리얼엔진 개발/Developing

[UnrealEngine5]랜덤위치에서 적 스폰하기

by yeni_0224 2023. 5. 10.
728x90
반응형

내가 지정한 여러 위치들 중 랜덤한 곳에서 적이 스폰되는 방법에 대해 정리해볼 것이다.

 

1. 스폰할 위치에 대한 클래스를 만들어준다

이 자리에서 적이 spawn 될 것이다.

 

2.Spawn Manager가 랜덤한 spawn위치들을 선택해서 그 자리에서 적이 뿅 나타나게 할 것이다.


1. 스폰 액터를 만들어주자. 정말 딱 적이 나타날 장소이다.

외관은 그냥 눈으로 확인할 수 있을 정도의 매쉬만 정해주었다. 

spawnSpotMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("UStaticMeshComponent"));
	spawnSpotMesh->SetupAttachment(RootComponent);

	ConstructorHelpers::FObjectFinder<UStaticMesh> tempSpawnSpotMesh(TEXT("/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cube.SM_Cube'"));
	if (tempSpawnSpotMesh.Succeeded())
	{
		spawnSpotMesh->SetStaticMesh(tempSpawnSpotMesh.Object);
		spawnSpotMesh->SetRelativeScale3D(FVector(0.8f));
		spawnSpotMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	}

2. Spawn Manager에서 스폰될 위치에 대해 정해주자

랜덤한 시간동안 랜덤한 위치에서 적이 생성되도록 할 것이고, 일정 갯수의 적이 다 나오면 Boss가 튀어나오도록 할 것이지만 일단 Boss 부분은 제외하고 적 부분만 보기로 한다. 적이 다 생성되면 boss가 spawn 되도록 하기만 하면 되니까 여러분도 할 수 있다. 혹시나 궁금하신 분이 있다면 그 때 공개하는걸루..!

void AcaEnemySpawnManager::BeginPlay()
{
	Super::BeginPlay();

	UGameplayStatics::GetAllActorsOfClass(GetWorld(), AcaEnemySpawnSpot::StaticClass(), spawnList);	
	
	GetWorldTimerManager().SetTimer(timerHandlespawncaEnemy, this, &AcaEnemySpawnManager::SpawnEnemy, 1, false);

	ACloseAttackEnemy* enmey = Cast<ACloseAttackEnemy>(UGameplayStatics::GetActorOfClass(GetWorld(), caEnemyFactory));
}

어떤 것들을 Spawn할지 list를 만들어주고, Spawn할 Enemy Class를 캐스팅해줍니다.

void AcaEnemySpawnManager::SpawnEnemy()
{
	EnemyCount++;

	if (limitedEnemyCount >= EnemyCount)
	{
		int randIndex = 0;		
		randIndex = FMath::RandRange(0, spawnList.Num() - 1);
		if (randIndex == prevRandIndex)
		{
			randIndex = (randIndex + 1) % spawnList.Num();
		}

		FVector loc = spawnList[randIndex]->GetActorLocation();
		FRotator rot = spawnList[randIndex]->GetActorRotation();
		GetWorld()->SpawnActor<ACloseAttackEnemy>(caEnemyFactory, loc, rot);

		int randomTime = FMath::RandRange(minTime, maxTime);
		GetWorldTimerManager().SetTimer(timerHandlespawncaEnemy, this, &AcaEnemySpawnManager::SpawnEnemy, randomTime);
		prevRandIndex = randIndex;

	}    
    //... 중략
}

RandRange를 사용해서 랜덤하게 값이 지정되도록 해주었다.

이렇게 해주고 나서 블루프린트에서 spawnList를 할당해주어야한다! build 계속해주면서 작업하다가 spawnList 생성하고난 후 list를 할당해주고 난 뒤 작업을 이어가주었다

 

마지막에는 Index 갱신해주는 작업까지!

728x90
반응형