계속 끙끙대던 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 |