[UE4] Physics Sub-stepping(피직스 서브스테핑)에 대한 정리 (2 / 2)

#언리얼4 공부중 / UE4 버젼: 4.22.3 / 피드백 환영

Physics Sub-stepping(피직스 서브스테핑)에 대한 정리 (1 / 2) 에서는 피직스 서브스테핑에 관련한 용어를 정리해 보았다.  이제 substep의 tick을 받을 수 있는 샘플 코드를 작성해보자.

Header에서는 FCalculateCustomPhysics 타입의 delegate를 선언하고, bind할 함수를 하나 정의하자.

// Header

UCLASS()
class BALLMOVEMENTPROJ_API AStaticMeshActor : public AActor
{
       GENERATED_BODY()
       
public:
       AStaticMeshActor();

protected:
       void BeginPlay() override;
       void Tick(float DeltaSeconds) override;

public:
       FCalculateCustomPhysics OnCalculateCustomPhysics;
       void SubstepTick(float DeltaTime, FBodyInstance* BodyInstance);
}

Cpp파일에는  생성자에서 OnCalculateCustomPhysics를 통해 SubstepTick을 바인드하자. 그리고 Tick함수에 아래와 같이 AddCustomPhysics를 매 틱마다 호출하도록 구성한다.

#include "AStaticMeshActor.h"
#include "Components/PrimitiveComponent.h"
#include "PhysicsEngine/BodyInstance.h"

AStaticMeshActor::AStaticMeshActor()
{
       PrimaryActorTick.bCanEverTick = true;
       OnCalculateCustomPhysics.BindUObject(this, &ABallStaticMeshActor::SubstepTick);
}

void AStaticMeshActor::BeginPlay()
{
       Super::BeginPlay();
       rootComp = Cast(GetRootComponent());
}

void AStaticMeshActor::SubstepTick(float DeltaTime, FBodyInstance* BodyInstance)
{
       UE_LOG(LogTemp, Warning, TEXT("[SubstepTick] DeltaTime=%f"), DeltaTime)
}

void AStaticMeshActor::Tick(float DeltaSeconds)
{
       UE_LOG(LogTemp, Warning, TEXT("[Tick] DeltaTime=%f"), DeltaSeconds);
       Super::Tick(DeltaSeconds);
       
       if (rootComp == nullptr)
              return;

       if (rootComp->GetBodyInstance() == nullptr)
              return;

       rootComp->GetBodyInstance()->AddCustomPhysics(OnCalculateCustomPhysics);
}

이렇게 코드를 구성하고, Physics Sub-stepping(피직스 서브스테핑)에 대한 정리 (1 / 2) 에서 세팅 했던 값으로 실행을 해보자. (Max Substep Delta Time=0.016, Max Substeps=2, Smooth Frame Rate: On, Smoothed Frame Rate Range: 22~62)

그럼 아래와 같은 로그 파일을 볼 수 있고, 프레임레이트가 낮아졌을때 ( 0.4 sec (2.5fps)), 두번의 SubstepTick이 찍힌 것을 확인 할 수 있다.  Max Substeps이 4라면 4번 찍혔을 것이다.

LogTemp: Warning: [Tick] DeltaTime=0.008337
LogTemp: Warning: [SubstepTick] DeltaTime=0.008337
LogTemp: Warning: [Tick] DeltaTime=0.400000
LogTemp: Warning: [SubstepTick] DeltaTime=0.016000
LogTemp: Warning: [SubstepTick] DeltaTime=0.016000
LogTemp: Warning: [Tick] DeltaTime=0.012291
LogTemp: Warning: [SubstepTick] DeltaTime=0.012291
LogTemp: Warning: [Tick] DeltaTime=0.008334
LogTemp: Warning: [SubstepTick] DeltaTime=0.008334
LogTemp: Warning: [Tick] DeltaTime=0.008334
LogTemp: Warning: [SubstepTick] DeltaTime=0.008334
LogTemp: Warning: [Tick] DeltaTime=0.008333
LogTemp: Warning: [SubstepTick] DeltaTime=0.008333
LogTemp: Warning: [Tick] DeltaTime=0.008334
LogTemp: Warning: [SubstepTick] DeltaTime=0.008334 

이제 SubstepTick 함수에서 오브젝트에 물리적인 효과를 주면, 렌더링 프레임이 가변하더라도 안정적인 결과를 얻어 낼 수가 있다. 


Posted in: UE4

Leave a Reply

Your email address will not be published. Required fields are marked *