#언리얼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 함수에서 오브젝트에 물리적인 효과를 주면, 렌더링 프레임이 가변하더라도 안정적인 결과를 얻어 낼 수가 있다.