겉보기엔 조건 문제처럼 보이지만,
실제로는 정렬 후 개수 비교 문제다.
int solution(vector<int> citations)
{
sort(citations.begin(), citations.end());
int n = citations.size();
for (int i = 0; i < n; i++)
{
int h = n - i;
if (citations[i] >= h)
return h;
}
return 0;
}
UPROPERTY(EditDefaultsOnly)
USoundBase* HitSFX;
UPROPERTY(EditDefaultsOnly)
USoundBase* DeathSFX;
UPROPERTY(EditDefaultsOnly)
UNiagaraSystem* HitVFX;
UPROPERTY(EditDefaultsOnly)
UNiagaraSystem* DeathVFX;
UGameplayStatics::PlaySoundAtLocation(
this,
AnimSet->HitSFX,
GetActorLocation()
);
UNiagaraFunctionLibrary::SpawnSystemAtLocation(
GetWorld(),
AnimSet->HitVFX,
HitLocation
);
→ 관리 포인트 분산
Spawner 내부에서 WaveId를 자동 갱신
void APotatoMonsterSpawner::AdvanceWave()
{
CurrentWaveIndex++;
if (CurrentWaveIndex >= WaveIdList.Num())
{
OnAllWavesFinished();
return;
}
StartWave(WaveIdList[CurrentWaveIndex]);
}
기존:
추가:
if (DistanceToPlayer < DistanceToWarehouse)
{
Blackboard->SetValueAsObject(TargetKey, Player);
}
else
{
Blackboard->SetValueAsObject(TargetKey, Warehouse);
}
AI 유연성 증가
GameMode가:
→ GameMode 책임 과다
Spawner가 웨이브 흐름 관리
GameMode는 상위 상태만 관리
Spawner->OnWaveFinished.AddDynamic(
this,
&AGameMode::HandleWaveFinished
);
GameMode는:
| 이전 | 이후 |
|---|---|
| GameMode 중심 제어 | Spawner 중심 제어 |
| WaveId 수동 관리 | WaveId 자동 갱신 |
| 책임 혼합 | 역할 분리 |