3. 플레이어 랜덤 스폰 구현

개발 일지|2024. 8. 31. 22:14

게임맵으로 이동할 때 랜덤한 위치에 캐릭터가 스폰되도록 해야한다.

이유는 정해진 위치에만 스폰되는것보다 더 재밌을것 같아서.

 

스폰 로직을 구성하기 위해 RandomSpawnSys 이름으로 빈 클래스를 하나 생성했다.

이 클래스에 랜덤 위치를 계산하고, 지형 위에 스폰되도록 위치를 조정하는 로직을 구현할 예정이다.

이 방식을 위해 지형을 스캔하여 전체 맵에서 특정 지역에 랜덤으로 떨어지게 하려고 하였으나, 캐릭터 스폰 시스템이 꼬여 캐릭터 클래스가 null이 되는 문제 발생.

 

제대로 작동하지 않는 부분을 고치지 못해 스폰 위치를 지정해서 그중에서 랜덤으로 스폰되도록 코드를 수정했다.

 

만들어진 C++ 클래스를 블루프린트에 옮겨 에디터에서만 보이고 플레이어에게는 보이지 않는, 충돌 옵션을 제외한 스태틱 메쉬를 입힌다.

Add Component에서 간단하게 Sphere 하나 입혀준다.

Detail 패널에서 Actor hidden in game 옵션을 켜 에디터에서만 보이게 하고, collision 옵션에서 NoCollision 옵션을 선택해 플레이어가 보이지 않는 스폰지점에 막히지 않도록 해준다.

 

랜덤 위치 스폰을 위해 플레이어 캐릭터 클래스에 함수를 하나 추가했다.

void AFirstPersonCharacter::SpawnPlayerAtRandomLocation()
{
	TArray<AActor*> SpawnPoints;
	UGameplayStatics::GetAllActorsOfClass(GetWorld(), ASpawnPoints::StaticClass(), SpawnPoints);

	if (SpawnPoints.Num() == 0) {
		UE_LOG(LogTemp, Error, TEXT("No Spawn Points! Fix your Logic."));
		return;
	}

	int32 RandomPoint = FMath::RandRange(0, SpawnPoints.Num() - 1);
	ASpawnPoints* ChosenSpawnPoint = Cast<ASpawnPoints>(SpawnPoints[RandomPoint]);

	if (ChosenSpawnPoint) {
		SetActorLocation(ChosenSpawnPoint->GetActorLocation());
		SetActorRotation(ChosenSpawnPoint->GetActorRotation());
	}
	else {
		UE_LOG(LogTemp, Error, TEXT("Failed to cast Chosen Spawn Point!"));
	}
}

 

SpawnPoint를 AActor 타입의 포인터 배열로 선언해, 여러개의 스폰 포인트들을 담을 수 있도록 준비한다.

모든 액터를 포괄적으로 다룰수 있는 AActor 타입으로 먼저 선언해둔 다음, 가져온 객체들을 ASpawnPoints 객체로 캐스팅 한다.

현재 월드에 존재하는 SpawnPoint 클래스 객체들을 찾아 SpawnPoints 배열에 담는다.

RandomPoint 변수에 랜덤 인덱스를 저장한 다음, AActor 타입으로 가져온 SpawnPoint 액터들을  ASpawnPoints로 타입캐스팅 한다.

 

이후 선택된 ChosenSpawnPoint 객체에서 Location 정보와 Rotation 정보를 가져와 플레이어 캐릭터의 위치와 회전값을 결정해주면 랜덤 스폰 시스템이 완성된다.

 

처음에 계획했던 시스템처럼 되진 않았지만, 내가 처음 결정해둔 위치에 플레이어들이 랜덤하게 스폰되는 시스템은 구축했다.

 

처음 개발자가 결정해둔 위치 중 랜덤으로 스폰하는 방식은 Dead By Daylight처럼 오랜시간 플레이한 유저가 처음 스폰 위치를 모두 외우고 시작시점의 플레이를 유리하게 가져가는 모습이 나올까봐 전체 지형중에 완전하게 랜덤하게 떨어지는 방식을 구현하려 했었다.

하지만 로직의 에러를 해결하지 못하고 위와 같은 방식으로 변경했다.

완전하게 랜덤하게 떨어진다면 같은 방 안에 여러명의 유저가 떨어지는 등의 대참사가 발생할 수 있었다고 좋게 생각하기로 했다..

 

'개발 일지' 카테고리의 다른 글

5. 멀티플레이 개발  (0) 2024.11.08
4. 서버 구축을 위한 삽질  (0) 2024.09.02
2. 움직이는 플레이어 캐릭터 만들기  (0) 2024.08.26
1. 메인메뉴 구성  (0) 2024.08.26
시작  (0) 2024.08.21

댓글()