UE5

2.27 작업목록

개발꼬순내 ㅣ 2025. 2. 27. 21:35

기존에는 레벨에다가 Portal을 배치해두고 한종류의 ai를 스폰시켰다.

 

오늘한 작업내용은

1. 포털에 여러종류의 기본몹 ai를 스폰.

2. Max Wave에 도달할 경우 Boss ai를 스폰.

3. 레벨 전체에다 Nav Mesh 배치

4. 포털을 스폰시키는 PotalSpawnPoint 구현.

 

그래서 ai를 스폰시키는 과정을 보자면

-여러개의 Portal Spawn Point를 레벨에 배치

-스폰할 Portal 갯수 설정.

-Portal Spawn Point중에서 랜덤으로 Portal 생성.

-생성된 포털에서 ai를 균일하게 스폰

 

사실 과정을 보면 Portal을 스폰시키고 그 위치에 ai를 스폰시키는거라 Portal은 굳이 없어도 되지만

컨셉상 Portal없이 ai가 스폰되는것도 웃기는 일인지라 이렇게 구현하게 되었다.

 

void ACP_GameState::SpawnPortal() //월드에 있는 Spawn Portal Point를 모두 찾아 저장후 랜덤좌표에 portal 생성
{
	TArray<AActor*> FoundActors;
	TArray<ACP_PotalSpawnPoint*> Portal;
	TArray<FVector>PortalSpawnLocation;

	UGameplayStatics::GetAllActorsOfClass(GetWorld(), ACP_PotalSpawnPoint::StaticClass(), FoundActors);
	Portal.SetNum(FoundActors.Num());
	if (Portal_Nums > Portal.Num())
	{
		CP_LOG(Warning, TEXT("Over Portal Spawn. add more BP_PortalSpawnPoint"));
	}

	for (int32 i = 0; i < FoundActors.Num(); i++)
	{
		Portal[i] = Cast<ACP_PotalSpawnPoint>(FoundActors[i]);
		PortalSpawnLocation.Push(Portal[i]->PortalLocation());
	}

	AActor* SpawnPortal;
	UClass* SpawnPortalClass = LoadObject<UClass>(nullptr, TEXT("/Game/_Game/CoreBP/BP_AISpawnPortal.BP_AISpawnPortal_C"));
	TArray<int32> Check_SamePoint;

	for (int32 i = 0; i < Portal_Nums; i++)
	{
		int32 RandNum = FMath::RandRange(0, PortalSpawnLocation.Num() - 1);
		if (Check_SamePoint.Num() > 0)
		{

			for (int j = 0; j < Check_SamePoint.Num(); j++)
			{
				if (RandNum == Check_SamePoint[j])
				{
					while (RandNum == Check_SamePoint[j])
					{
						RandNum = FMath::RandRange(0, PortalSpawnLocation.Num() - 1);

					}
				}
			}

			SpawnPortal = GetWorld()->SpawnActor<AActor>(
				SpawnPortalClass,
				PortalSpawnLocation[RandNum],
				FRotator::ZeroRotator,
				SpawnParams
			);
		}
		else
		{
			SpawnPortal = GetWorld()->SpawnActor<AActor>(
				SpawnPortalClass,
				PortalSpawnLocation[RandNum],
				FRotator::ZeroRotator,
				SpawnParams
			);
		}
		Check_SamePoint.Push(RandNum);

	}
}

구성자체는 ai를 스폰시키는 Spawn Owner와 비슷하게 생겼다.

 

먼저 맵에 존재하는 Point들을 모두 가져와서 저장하고 그 주소를 따낸다. 그리고 그 좌표중에 랜덤으로 Portal을 스폰시키는 것인데 문제가 한지점으로 여러개의 포탈이 스폰될수도 있다는 것이다.

그래서 중복된 좌표로 스폰시키는것을 허용하지 않는 로직을 추가시켰다.

 

 

내일은 아마 여기에다가 엘리베이터 만들고 레벨 여기저기에 재밌을만한거 넣고 다닐 것 같다.

 

아 그리고 MainMenu UI랑 GameState연동시키는거랑 게임 중간중간 타이머로 텀을 두는 작업을 먼저 해야될 것 같다.

'UE5' 카테고리의 다른 글

Chat Base Ball 과제물  (1) 2025.03.28
Delegate, Mode-State-Instance  (0) 2025.03.05
Portal 마무리  (0) 2025.02.26
데이터 정리  (0) 2025.02.24
AI Spawn  (0) 2025.02.21