본문 바로가기

프로그래밍

특정 조건에서 물리 시뮬에이션 중지 in 언리얼5

728x90

Unreal Engine 5 (UE5)에서 특정 조건에서 물리 시뮬레이션을 일시 중지하거나 "슬립" 상태로 만들려면 블루프린트 또는 C++ 코드를 사용할 수 있습니다. 

 

아래의 예는 속도가 30 단위 이하일 때 물리 시뮬레이션을 일시 중지하도록 코드를 수정하려면, GetComponentVelocity() 함수를 사용하여 컴포넌트의 속도를 확인할 수 있습니다. 

// 기본값 설정
AYourCustomActor::AYourCustomActor()
{
    PrimaryActorTick.bCanEverTick = true;
}

// 매 프레임 호출
void AYourCustomActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // 속도가 임계값 이하인지 확인
    if (ShouldPausePhysics())
    {
        PausePhysics();
    }
}

bool AYourCustomActor::ShouldPausePhysics()
{
    TArray<UPrimitiveComponent*> Components;
    GetComponents<UPrimitiveComponent>(Components);

    for (UPrimitiveComponent* Component : Components)
    {
        if (Component->IsSimulatingPhysics())
        {
            FVector Velocity = Component->GetComponentVelocity();
            if (Velocity.Size() < 30.0f)
            {
                return true;
            }
        }
    }

    return false;
}

void AYourCustomActor::PausePhysics()
{
    TArray<UPrimitiveComponent*> Components;
    GetComponents<UPrimitiveComponent>(Components);

    for (UPrimitiveComponent* Component : Components)
    {
        if (Component->IsSimulatingPhysics())
        {
            Component->SetSimulatePhysics(false);
        }
    }

    // 선택적으로, 일정 시간 후 물리 시뮬레이션을 재개하는 타이머 설정
    GetWorld()->GetTimerManager().SetTimer(UnusedHandle, this, &AYourCustomActor::ResumePhysics, 5.0f, false);
}

void AYourCustomActor::ResumePhysics()
{
    TArray<UPrimitiveComponent*> Components;
    GetComponents<UPrimitiveComponent>(Components);

    for (UPrimitiveComponent* Component : Components)
    {
        if (!Component->IsSimulatingPhysics())
        {
            Component->SetSimulatePhysics(true);
        }
    }
}

이 코드에서는:

 

ShouldPausePhysics()는 물리 시뮬레이션을 일시 중지할 조건을 위한 자리 표시자입니다.

  • ShouldPausePhysics() 함수가 컴포넌트의 속도가 30 단위 이하인지 확인합니다.
  • 속도가 임계값 이하일 경우 true를 반환하여 PausePhysics() 함수를 호출합니다.

PausePhysics()는 액터의 모든 컴포넌트에 대해 물리 시뮬레이션을 중지합니다.

 

ResumePhysics()는 일정 시간(이 경우 5초) 후에 물리 시뮬레이션을 재개합니다.

 

이 코드가 물리 시뮬레이션을 속도가 낮을 때 일시 중지하는 데 도움이 되길 바랍니다. 추가적인 도움이 필요하시면 언제든지 말씀해 주세요!

728x90