ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 총알 이펙트
    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
Designed by Tistory.