유저의 입력에 따른 이동처리

언리얼엔진3 에서 방향키 입력에 따른 처리과정

설정파일

Engine 레이어에서 기본적으로 설정된 방향키는 아래와 같다.

Engine/Config/BaseInput.ini
[Engine.PlayerInput]
...
Bindings=(Name="MoveForward",Command="Axis aBaseY Speed=1.0")
...
Bindings=(Name="W",Command="MoveForward")

W 를 누르면 MoveForward 커맨드가 수행되고 MoveForward 커맨드는 Axis aBaseY Speed=1.0 을 수행한다.

Axis 커맨드

엔진에서 Axis 커맨드를 처리하는 부분은 아래와 같다.

UnIn.cpp
...
UBOOL UInput::Exec( const TCHAR* Str, FOutputDevice& Ar )
{
    ...
    else if ( ParseCommand( &Str, TEXT("AXIS") ) )
    {
        FLOAT* Axis;
 
        if (
            ParseToken( Str, Temp, ARRAY_COUNT(Temp), 0 ) &&
            (Axis=FindAxisName(Temp)) != NULL
        )
        {
            ... // Axis 에 적절한 값을 넣어주는 로직
        }
    }
    ...
}

전체적인 흐름은 다음과 같다.

  1. Axis 커맨드는 유저의 방향키에 따라 PlayerInput 에 존재하는 2개의 입력축 (X축 입력은 aBaseX, Y축 입력은 aBaseY) 에 적절하게 값을 넣어주는 역할을 한다.
  2. Axis 뒤에 aBaseX 또는 aBaseY 키워드가 올 수 있는데 이것이 FindAxisName 함수의 파라메터로써 사용되고, FindAxisName 함수는 내부적으로 'PlayerInput.aBaseX', 'PlayerInput.aBaseY' 의 네이티브 변수의 포인터를 리턴한다.
  3. 그 포인터에 Speed=1.0 키워드로부터 추출한 값을 적절하게 반영하여 넣는다.1)

요약하자면 Axis aBaseY Speed=1.0 커맨드는 PlayerInput.aBaseY 변수에 1.0 의 값을 대입한다.

PlayerInput.aBaseY

PlayerInput 에 aBaseY 란 변수는 플레이어의 전/후 이동을 책임지는 변수에 대입된다. (예상하겠지만 X 축은 횡이동)

해당 로직은 아래와 같다.

PlayerInput.uc
event PlayerInput( float DeltaTime )
{
    ...
    aForward += aBaseY;
    ...
}

aForward 를 비롯하여 aTurn, aStrafe, aUp, aLookUp 변수가 플레이어 이동에 관여되어 있다.

PlayerInput.aForward

PlayerInput 에 aForward 변수는 실제 플레이어의 Acceleration 에 영향을 미친다.

해당 로직은 아래와 같다.

PlayerController.uc
state PlayerWalking
{
    function PlayerMove( float DeltaTime )
    {
        ...
 
        GetAxes( Pawn.Rotation, X, Y, Z );
 
        NewAccel = PlayerInput.aForward * X + PlayerInput.aStrafe * Y;
 
        ...
 
        ProcessMove( DeltaTime, NewAccel, DoubleClickMove, OldRotation - Rotation );
 
        ...
    }
}
1) PlayerInput.aBaseY 에 영향을 주는 요소는 Speed=1.0 키워드 말고 Invert, Deadzone, AbsoluteAxis 도 있다. 이것들에 대한 것은 위 코드를 찾아보면 더 자세히 알 수 있다.