UE5

Portal 마무리

개발꼬순내 ㅣ 2025. 2. 26. 21:26

계속 끙끙대던 Portal에서의 AI 균일 스폰코드를 완성했다.

 

void ACP_GameState::AI_Spawn_Owner()
{
	TArray<AActor*> FoundActors;
	TArray<ACP_AISpawnPoint*> Portal;

	Number_AI = ((Wave * 3) + 1) / 2; // 2, 3, 5, 6

	UCP_GameInstance* GameInstance = Cast<UCP_GameInstance>(UGameplayStatics::GetGameInstance(this));
	GameInstance->Set_AICount(Number_AI);
	if (!EnemyClass)  // 블루프린트에서 설정이 안 되었을 경우 방어 코드
	{
		CP_LOG(Warning, TEXT("EnemyClass Didn't Enable"));
		return;
	}

	//월드상에서 ACP_AISpawnPoint 객체를 모두 찾아 FoundActors에 Push
	UGameplayStatics::GetAllActorsOfClass(GetWorld(), ACP_AISpawnPoint::StaticClass(), FoundActors);
	int Portal_Number = FoundActors.Num(); //에디터 내 포털 갯수

	//객체가 존재한다면 실행
	if (Portal_Number > 0)
	{
		Portal.SetNum(Portal_Number);
		for (int32 i = 0; i < Portal_Number; i++)
		{
			Portal[i] = Cast<ACP_AISpawnPoint>(FoundActors[i]);
			SpawnLocation.Push(Portal[i]->PortalLocation());
		}

		SpawnParams.Owner = this;

		//스폰위치 충돌이 있을 경우 위치 조정후 스폰
		SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;

		GetWorldTimerManager().SetTimer(
			AIWatingTimerHandel,
			std::bind(&ACP_GameState::Spawner, this, Portal_Number),
			Dealay_Time,
			true
		);
	}
}

 

스폰을 위한 데이터들을 생성하고 명령하는 함수이다.

레벨에 생성된 포털 객체를 담는 Portal 배열을 추가했고 쓰잘때기 없던 변수들을 모두 지웠다.

 

타이머에서 Spawner 함수를 사용할 때 bind를 통해서 인수까지 전달하도록 변경했다.

 

void ACP_GameState::Spawner(int32 Portal_Number)
{
	for (int i = 0; i < Portal_Number; i++)
	{
		AActor* SpawnedAI = GetWorld()->SpawnActor<AActor>(
			EnemyClass,
			SpawnLocation[i],
			FRotator::ZeroRotator,
			SpawnParams
		);
		++AI_Counting;
		
		if (!SpawnedAI)  // AI 스폰이 실패한 경우
		{
			CP_LOG(Warning, TEXT("AI Spawn Failed"));
		}
		else  // AI 스폰이 성공한 경우
		{
			CP_LOG(Warning, TEXT("AI Spawn Success: %s"), *SpawnLocation[i].ToString());
		}

		if (AI_Counting == Number_AI)//AI가 다 스폰되면 생성 중지
		{
			GetWorldTimerManager().ClearTimer(AIWatingTimerHandel);
			AI_Counting = 0;
			break;
		}
	}
}

 

ai를 스폰하는 함수다.

전에도 for문으로 스폰을 시켰는데 5마리를 스폰시킨다고 하면 6마리가 한꺼번에 포탈에서 쏟아져 나왔었다.

 

사실 우르르 쏟아지던 문제는 지금도 잘 모르겠다.

또한 기존에는 avrspawn 변수를 둬서 포탈마다 균등하게 스폰을 분배하려 했는데

그냥 aicount 늘리면서 원하는 양이 될 때 break 를 걸어버리면 됬다.

 

그래서 크게 수정할게 없었음에도 꽤 오랜시간 머리를 싸맸다.

 

이후에는 레벨 디자인에 들어갔다.

디자인적으로는 크게 수정할 부분이 없고 건드리면 더 어색해질 것 같았다. 그래서 몇가지 기능들을 추가할 계획이다.

1. 허공으로 떨어지는 길들 차단

2. 틱당 Directinal light를 회전시켜 태양의 움직임 표현

3. 중간중간 Door Mesh들이 배치되어있는데 다가가면 문이 열리고 내부에 엘리베이터 구현.

4. 그 외 여러 구조물들에 움직임을 넣을 수 있으면 좋겠다.

'UE5' 카테고리의 다른 글

Delegate, Mode-State-Instance  (0) 2025.03.05
2.27 작업목록  (0) 2025.02.27
데이터 정리  (0) 2025.02.24
AI Spawn  (0) 2025.02.21
Character Spawn  (0) 2025.02.20