-
총알 이펙트Game Programming/언리얼 2023. 10. 4. 23:47
총알 이펙트를 주고 싶어서 한번 만들어 보기로 했다.
처음에는 리스트를 사용하여 Component->IsActive() == false이면 노드를 삭제하는 방식으로 했는데
노드 삭제가 잘 되지 않았다....
분명 현재 노드를 제외하고 이전노드와 다음 노드를 연결했는데
그래서 생각난 것이 오브젝트풀이였다.
ShootingParticle.SetNum(1000, false);
위와 같이 TArray를 미리 할당하고, 메모리 자동 조절 기능은 껐다.
for (int i = 0; i < ShootingParticle.Num(); ++i) { if (ShootingParticle[i] == nullptr) { GEngine->AddOnScreenDebugMessage(3, 1, FColor::Red, FString::Printf(TEXT("%d"), i)); ShootingParticle[i] = Bullet; break; } }
그리고 UParticleSystemComponent를 할당되지 않은 공간에 담았다.
for (int i = 0; i < ShootingParticle.Num(); ++i) { UParticleSystemComponent* Component = ShootingParticle[i]; if (Component) { if (!Component->IsActive()) { Component->SetWorldRotation(vRocketDir.ToOrientationQuat()); const FTransform ComponentTransform = Component->GetRelativeTransform(); FVector vCurrentLocation = ComponentTransform.GetLocation(); GEngine->AddOnScreenDebugMessage(1, 1, FColor::Blue, FString::Printf(TEXT("Tick: %f %f %f"), vCurrentLocation.X, vCurrentLocation.Y, vCurrentLocation.Z)); Component->SetWorldLocation(vCurrentLocation + vRocketDir * DeltaTime * 3000.f); } else { GEngine->AddOnScreenDebugMessage(3, 1, FColor::Red, FString::Printf(TEXT("Tick"))); ShootingParticle[i] = nullptr; } } }
그 뒤, Tick 함수에서 컴포넌트가 비활성화되면 오브젝트 풀의 메모리를 빈 값으로 만들었다.
Tick에서 매 프레임마다 반복문을 돌리는 것은 비효율적이므로 0.01시간 마다 파티클 위치를 업데이트했다.
'Game Programming > 언리얼' 카테고리의 다른 글
GunLight 추가 (0) 2023.10.05 Socket offset (0) 2023.10.05 빔 파티클 (1) 2023.10.03 임펙트 파티클 (1) 2023.10.03 라인 트레이스 추가 (0) 2023.10.03