Class GameDev* SheepAdult

[Unreal Engine] InputAxis 에서의 DeltaTime (Character Movement DeltaTime) 본문

Unreal Engine

[Unreal Engine] InputAxis 에서의 DeltaTime (Character Movement DeltaTime)

SheepAdult 2023. 5. 4. 21:25

 fps는 컴퓨터의 하드웨어마다 모두 다르기 때문에 deltatime 또한 다르게 계산된다.

(참고 - https://sheep-adult.tistory.com/56)

 그런데 언리얼 엔진에서 InputAxis 함수는 매 프레임마다 호출이 되지만 deltatime 매개 변수가 없고 Tick 함수와 분리가 되어 있기 때문에 어떤 방식으로 처리되는지 헷갈릴 수 있다(제가 그랬..). 그렇다면 입력 값은 캐릭터의 움직임과 deltatime에 대해서 어떻게 처리될까? 

 

 먼저, 만약 사용자가 입력을 하면 InputAxis의 인자로 입력 값이 전달된다. 입력 '축'이므로 음수 값과 양수 값이 존재할 수 있고(일반적으로 일반 input은 프로젝트 세팅의 "입력" 카테고리의 값, Enhanced Input에서는 인풋에 관련된 블루프린트에서 설정), 입력한 축의 값을 통해 캐릭터 움직임을 제어하는 함수로 전달된다.

 

 언리얼 엔진의 캐릭터 관련 클래스에서는 캐릭터를 움직이는 키를 입력했을 경우 여러 가지 연산을 한다. 예를 들어, 중력이나 마찰력, 공기 저항 등 여러 가지의 요소들이 CharacterMovementComponent 내에서 아래와 같이 연산된다.

// CharacterMovementComponent.cpp
// CalcVelocity의 경우는 아래와 같으며 공기 저항 등은 각 함수에서 따로 연산한다.
void UCharacterMovementComponent::CalcVelocity(float DeltaTime, float Friction, bool bFluid, float BrakingDeceleration)
{
	// Do not update velocity when using root motion or when SimulatedProxy and not simulating root motion - SimulatedProxy are repped their Velocity
	if (!HasValidData() || HasAnimRootMotion() || DeltaTime < MIN_TICK_TIME || (CharacterOwner && CharacterOwner->GetLocalRole() == ROLE_SimulatedProxy && !bWasSimulatingRootMotion))
	{
		return;
	}
    ...
}

 그냥 일반 적인 입력 축 값을 인자로 받는 AddMovementInput 함수에는 deltatime 연산이 없지만 위에서 언급한 마찰력, 중력 등 연산을 할 때에 언리얼 엔진 자체적으로 deltatime을 계산하기 때문에 우리는 캐릭터의 움직임에는 deltatime 연산을 따로 해 줄 필요가 없다.

 그래서 만약 Input Axis에 바인딩해 놓은 함수의 매개변수(AxisValue)를 사용할 경우, 프로그래머가 직접 deltatime연산을 해줘야 한다.

// MainCharacter.cpp
void AMainCharacter::MoveRight(float AxisValue)
{
	UWorld* World;
    if (World != nullptr)
    {
		int NormalizedAxisValue = AxisValue * World->GetDeltaSeconds();
        ...
        // 적용
        ...
    }
}

작문 능력이 좋지 않아 글이 많이 빈약하고 부족하지만, 축약하면

1. 입력한 축 값을 움직임과 관련된 함수로 전달하고

2. 움직임 자체에는 deltatime연산이 들어가지 않지만, 여러 물리적인 힘에 deltatime이 들어가면서 하드웨어에 독립적으로 작용할 수 있다.

3. 즉, InputAxis의 매개변수인 AxisValue만 사용한다면 수식에 넣을 경우 deltatime을 해줘야 하지만 캐릭터의 움직임에 관해서는 deltatime연산을 할 필요가 없다.