IT/UE5
[UE5]액터를 큐에 넣고 제거하기
u149_cinderella
2025. 4. 13. 01:17
void AtalesGameMode::UpdateElectricVFX(float DeltaTime)
{
if (!SpawnedMinMonster) return;
FVector MinMonsterLocation = SpawnedMinMonster->GetActorLocation();
// 큐의 앞부분 액터들 체크
while (!ElectricActorQueue.IsEmpty())
{
AElectric* ElectricActor;
ElectricActorQueue.Peek(ElectricActor);
if (!ElectricActor)
{
// 유효하지 않은 액터는 제거
ElectricActorQueue.Pop();
continue;
}
// 현재 위치
FVector NewLocation = ElectricActor->GetActorLocation();
// 새 위치 계산
float ElectricMoveSpeed = 1.f;
NewLocation.Y = NewLocation.Y - ElectricMoveSpeed * DeltaTime;
ElectricActor->SetActorLocation(NewLocation);
// Y축 기준으로 Min 몬스터를 지났는지 확인
if (NewLocation.Y <= MinMonsterLocation.Y)
{
// Min 몬스터를 지났으므로 제거
if (GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("data: %f %f"), NewLocation.Y, MinMonsterLocation.Y));
}
ElectricActorQueue.Pop();
ElectricActor->Destroy();
}
else
{
// 아직 도달하지 않았으면 더 이상 체크할 필요 없음
break;
}
}
}
우선 번개를 생성할때마다 큐에 넣어준다. 그다음에 매틱마다 모든 번개들이 몬스터와 부딪히는지 검사하는 비용보다는 큐의 가장 첫번째 요소가 몬스터 보다 뒤에 있는지 검사, 뒤에 있다면 삭제한다. 아니라면 반복문 종료. 뒤에있다면 다시 반복해서 몬스터 뒤의 모든 액터를 지우는게 비용상 더 유리해서 이런식으로 구현했다.
덱을 쓸까도 고민했지만 제일 첫번째 요소만을 관리할것이기 때문에 그냥 큐로 했다.(우선순위큐는 logn이니까 논외)
또 공식문서를 보다 알게 된것인데
저기 보면 consumer thread라고 되어있는데 이게 뭔가하고 보니
생산자 소비자 패턴을 의미하는 것 이다.
소비자 쓰레드일때만 실행된다는 의미인데 멀티쓰레드를 구현해서 쓰는게 아니라면 굳이 신경쓸필요는 없을 듯 하다.
결과
번개를 삼키는 모양새가 되긴 했는데 사실 그냥 최적화를 위해서 이렇게 작성한거다.
어차피 플레이어가 저 뒤로 갈일은 없을테니 말이다.