개요
[ 5.3. 플레이어 입력 ] 에서 어떤 플레이어 입력이 있는지 살펴 보았습니다. 이 섹션에서는 이동과 관련한 로직 및 애니메이션에 대해서 살펴 보도록 하겠습니다.
이동( locomotion, 보행, 운동 )과 관련된 로직에 대해서 다루도록 하겠습니다. 간단하게 요약하자면 UT 의 이동 로직은 UUTCharacterMovment 컴포넌트에 의존합니다. Character component 의 처리 결과에 따라서 어떠한 애니메이션들을 블렌딩할지를 결정하게 됩니다.
1인칭 캐릭터에서는 "Content/RestrictedAssets/Universal/1stPerson/UT4_Base_1stP_AnimBP.uasset" 의 "Main_Motion" FSM( finite state machines ) 을 사용하며, 3인칭 캐릭터에서는 "Content/RestrictedAssets/Animations/Universal/UT4_Base_AnimBP.uasset" 의 "Locomotion" FSM 과 "Landing" FSM 을 사용합니다.
일단 Character Movement 컴포넌트의 주요 역할은 물리와 애니메이션에서 사용할 자료( 변수 )를 준비하는 것입니다. 만약 Character Movement 컴포넌트가 없고 Player Controller 만 존재한다면, Player Controller 나 Character 에서 물리 및 애니메이션을 처리해야만 할 것입니다.
Character Movement 컴포넌트
UT 에서 기본 Character Movement 컴포넌트의 클래스는 UUTCharacterMovement 입니다. "DefaultCharacter" 블루 프린트를 열어서 "Components" 뷰를 보면 아래쪽에 "UTCharacterMovment(Inherit)" 라는 항목을 볼 수 있습니다. 오른쪽의 "Details" 뷰를 보면 매우 많은 속성 카테고리들이 존재함을 알 수 있습니다.
보시면 알겠지만 게임에서 사용할 만한 상황들은 거의 다 들어 가 있습니다. 물론 상황에 맞춰 FSM 을 구성하는 수고는 해야 합니다.
이동 모드
Character Movement 컴포넌트에서 이동 모드의 전환은 FSM 으로 표현될 수 있습니다만 여기에서 다루지는 않겠습니다. 애니메이션 블루프린트마다 애니메이션 FSM 을 따로 구성하기 때문에 코드 상에서의 상태 전환에 대해서 언급하는 것은 크게 의미가 없을 것 같습니다. 애니메이션 FSM 에 대해서는 다른 문서에서 다루도록 하겠습니다. 단지 다음과 같은 이동 모드들이 있다는 것만 알아 두시면 될 것 같습니다.
- Walking : 땅바닥에 붙어서 걸어다니는 이동 모드.
- NavWalking : AI 등이 네비게이션 메쉬와 길찾기를 통해서 걸어다니는 모드.
- Swimming : 물에 들어 갔을 때의 이동 모드.
- Falling : 점프를 하거나 바닥에 닿지 않아 떨어지고 있을 때의 이동 모드.
- Custom : 사용자의 커스텀한 이동 모드.
- Flying : 날아다니는 이동 모드.
이제 각 이동 모드와 관련한 중요한 속성들을 살펴 보도록 하겠습니다. 대부분 어렵지 않은 속성들을 가지고 있기 때문에 이해하는데 큰 어려움은 없을 것입니다. 일단 어떤 기능들을 가지고 있는지 이해하고 있어야지 이미 존재하는 기능을 또 구현하는 불상사를 막을 수 있기 때문에, 지루하더라도 한 번씩은 읽어 보시기 바랍니다.
제가 밥상은 차려줄 수 있지만, 떠 먹는건 알아서 하시기 바랍니다.
Character Movement
각 이동 모드의 가속도 및 감속도를 설정하는 곳입니다.
이름 |
설명 |
MaxFallingAcceleration |
- Falling 시의 최대 가속도( 이는 AirControl 속성에 의해 스케일링 됨 ).
|
MaxSwimmingAcceleration |
|
MaxRelativeSwimmingAccelNumerator |
- Swimming 시의 부가적 가속도인데, 속도 크기에 의해 나눠짐. Swimming 가속도는 MaxSwimmingAcceleration + MaxRelativeSwimmingAccelNumerator / ( Speed + MaxRelativeSwimmingAccelDenominator ) 임.
|
MaxRelativeSwimmingAccelDenomitor |
- Swimming 가속도 공식의 일부. Swimming 가속도는 MaxSwimmingAcceleration + MaxRelativeSwimmingAccelNumerator / ( Speed + MaxRelativeSwimmingAccelDenominator ) 임.
|
BrakingDecelerationSliding |
|
DefaultBrakingDecelerationWalking |
- Walking 시의 정지 감속도 - BrakingDecelerationWalking 과 같은 값으로 설정하라.
|
IgnoreClientMovementErrorChecksAndCorrection |
- true 이면, 이 이동 컴포넌트 상에서 클라이언트 에러를 위한 서버 위치 차이 검사를 무시한다.
- 이는 캐릭터가 잠시 동안 극단적인 속력으로 움직이는데 클라이언트에서 부드럽게 보이도록 만들고 싶을 때 유용하다. 사용하고 나면 비활성했는지 확인해야 한다. 왜냐하면 이것은 캐릭터의 서버-클라이언트 이동 보정을 오동작하게 만들기 때문이다.
|
Character Movement(General Settings)
일반적인 설정을 하는 곳입니다.
이름 |
설명 |
GravityScale |
- 커스텀 중력 스케일. 캐릭터를 위한 중력에 이 값이 곱해진다.
|
MaxAccelleration |
|
BrakingFrictionFactor |
- 정지할 때 사용되는 실제 마찰력 값에 곱해지기 위한 요소이다.
- 이는 현재 사용되는 모든 마찰력 값에 적용된다. UseSeperateBrakingFriction 에 의존한다.
- @note : 이는 경험적 이유로 2 값이 기본값이다. 1 값은 실제 drag equation 이다.
|
BrakingFriction |
- ( Acceleration = 0 이거나 캐릭터가 최대 속력을 초과하고 있을 때마다 ) 정지시에 적용될 마찰력 ( drag ) 상수; 실제 사용되는 값은 BrakingFrictionFactor 와 곱해진다.
- 정지중일 때, 이 속성은 바닥을 통해 움직이고 있을 때 얼마나 많은 마찰력이 적용될지를 제어할 수 있도록 해 준다. 이는 현재 속도를 스케일링하는 반대쪽 힘을 적용하게 된다.
- 정지는 마찰력( 속도 의존적인 drag )와 상수 감속( deceleration )으로 구성된다.
- 이는 모든 이동 모드에서 사용되는 현재값이다; 만약 이것을 원하지 않는다면, 이동 모드가 바뀔 때 이 값이나 bUseSeperatedBrakingFriction 을 재정의하라.
- bUseSerperatedBrakingFriction 이 true 일 때만 사용된다. 그렇지 않으면 GroundFriction 같은 현재 마찰력이 사용된다.
|
UseSeperateBrakingFriction |
- 만약 true 이면, ( 가속이 없을 때 ) 캐릭터를 천천히 멈추게 하기 위해서 BrakingFriction 이 사용될 것이다.
- 만약 false 이면, CalcVelocity() 에 넘겨지는 것과 같은 마찰력을 사용할 것이다( 예를 들어 걸어다닐 때의 GroundFriction ). 이는 BrakingFrictionFactor 와 곱해진다.
- 이 설정은 모든 이동 모드에 적용된다; 만약 특정 모드에서 이를 원하지 않는다면, 이동 모드가 변경될 때 토글링하는 것을 고려해 보라.
|
CrouchedHalfHeight |
- Crouching( 앉기 )시에 사용할 충돌 절반 높이( 컴포넌트 스케일이 각각 적용됨 ).
|
RotationRate |
- 초당 회전률. UseControllerDesiredRotation 이나 OrientationToMovement 가 true 일 때 사용된다. Infinite rotation rate 와 instant trun 을 위해서는 음수값을 설정한다.
|
OrientRotationToMovement |
- true 이면, 가속 방향을 향해 캐릭터를 회전시킨다. 이 때 회전률은 RotationRate 를 통해 지정된다. UsecontrollerDesiredRotation 을 덮어 쓴다.
- 보통 캐릭터의 UseControllerRotationYaw 같은 다른 설정들이 클리어되어 있기를 기대할 것이다.
|
Mass |
- 폰( pawn )의 질량( 운동량( momentum )이 주어졌을 때를 위해 ).
|
DefaultLandMovementMode | - 물 속에 있지 않을 때의 기본 이동 모드. 플레이어 스타트업이나 텔레포트시에 사용됨.
- Walking
- NavWalking
- Falling,
- Swimming
- Flying
- Custom
|
DefaultWaterMovementMode | - 물 속에 있을 때의 기본 이동 모드. 플레이어 스타트업이나 텔레포트시에 사용됨.
|
JustTeleported | - 위치 변화가 일반 이동에 의한 것인지 텔레포트에 의한 것인지 결정하기 위해서 이동 코드에서 사용됨. 만약 텔레포트가 아니면, 위치 변화 기반해 속도가 재계산될 수 있음.
|
WantstoCrouch | - true 이면, 다음 업데이트시에 crouch( 혹은 crouch 유지 )를 시도함. false 이면 다음 업데이트시에 crouching 종료를 시도함.
|
UseControllerDesiredRotation | - true 이면, 컨트롤러의 회전을 향해서 캐릭터를 부드럽게 회전시킨다. 이 때 회전률은 RotationRate 를 통해 지정된다. OrientRotationToMovement 에 의해 덮어 써 진다.
|
EnableScopedMovementUpdates | - If true, high-level movement updates will be wrapped in a movement scope that accumulates updates and defers a bulk of the work until the end.
- When enbled, touch and hit events will not be triggered until the end of multiple moves within n update, which can improve performance.
- 역주 : 이동을 누적시키는 것과 관련한 업데이트들을 한 번에 묶어서 처리하고, 나머지 업데이트들은 지연시켜서 나중에 처리하는 기능을 의미하는 듯하다.
|
RunPhysicsWithNoController | - true 이면, 캐릭터 소유자를 위한 컨트롤러가 존재하지 않더라도 이동을 실행할 것이다.
- 일반적으로 컨트롤러가 없으면, 이동은 무시되며, 캐릭터가 걷고 있다면 속도와 가속도가 0 이 될 것이다.
- 컨트롤러 없이 생성된 캐릭터에서 이 플래그가 활성화되면, 이동 모드를 DefultLandMovementMode 나 DefultWaterMovementMode 로 적절히 초기화할 것이다.
|
MaxSimulationTimeStep | - 각각의 분절된( discrete ) 시뮬레이션 스텝의 최대 타임 델타이다.
- 주로 큰 타임 스텝을 쪼개는 진보된 이동 모드에서 사용된다( usually those applying gravity such as falling and walking ).
- 이 값을 작게 하면, 빠르게 움직이는 오브젝트 시나리오나 복잡한 충돌 시나리오를 해결할 수 있는데, 성능 비용을 지불해야 한다.
- @경고 : 만약 ( MaxSimulationTimeStep * MaxSimulationIterations ) 가 최소 프레임율보다 너무 작다면, 마지막 시뮬레이션 스텝은 시뮬레이션을 완료하기 위해서 MaxSimulationTimeStep 을 초과할 수도 있다.
|
MaxSimulationIterations | - 각각의 분절된 시뮬레이션 스텝들을 위해 사용되는 반복( iteration ) 횟수.
- 주로 큰 타임 스텝을 쪼개는 진보된 이동 모드에서 사용된다( usually those applying gravity such as falling and walking ).
- 이 값을 증가시키면, 빠르게 움직이는 오브젝트 시나리오나 복잡한 충돌 시나리오를 해결할 수 있는데, 성능 비용을 지불해야 한다.
|
CrouchMaintainsBaseLocation | - true 이면, crouching 은 쪼그라든 캡슐의 중심을 낮춤으로써 캡슐의 바닥을 그대로 유지한다. false 이면, 캡슐의 바닥이 위로 올라가고 중심은 그대로 남는다.
- 같은 행위가 uncrouch 시에도 적용된다: true 이면 바닥은 같은 위치를 유지하고, 중심이 올라 간다. false 이면, 캡슐이 커지고 바닥이 무엇인가와 충돌할 때만 올라간다.
- 기본적으로 이 변수는 이동 모드가 변경될 때만 설정된다: walking 일 때 true 로 설정하고 그렇지 않으면 false 로 설정한다. 이동 모드가 변경될 때 이 행위를 재정의하는데 부담가질 필요가 없다.
|
RequestedMoveUseAcceleration | - path following 을 위해 가속도를 사용할지 여부를 결정한다.
- true 이면, path following 시에 목표 속도에 도달하기 위해서 가속도를 적용한다.
- false 이면, path following 속도가 직접 설정되며, 가속도를 고려하지 않는다.
|
CharacterMovement : Walking
걷기와 관련한 설정을 하는 곳입니다.
이름 |
설명 |
MaxStepHeight |
- 캐릭터가 걸어 올라 갈 수 있는 ( 계단의 ) 최대 높이.
|
WalkableFloorAngle |
- 걸어다닐 수 있는 표면의 최대 각도. 이보다 큰 각도이면 걷기에는 너무 뾰족한 것임.
|
WalkableFloorZ |
- 바닥의 법선( normal )에 대한 최소 z 값. 이것보다 크면 걸을 수 없음. WalkableFloorAngle 로부터 계산됨.
|
GroundFriction |
- 이동 제어에 영향을 주는 설정. 값이 높을수록 방향이 빠르게 변함.
- 만약 bUseSeperateBrakingFriction 이 false 라면, ( Acceleration 이 0 일 때마다 ) 멈출 때 더 빠르게 정지하는 능력에 영향을 주기도 함. 이는 BrakingFrictionFactor 와 곱해짐.
- 이 속성은 땅바닥 위를 이동하다가 정지할 때 마찰력이 얼마나 적용되어야 하는지를 사용자가 제어할 수 있도록 하는 속성임. 이는 현재 속도를 스케일링하는 반대방향의 힘임.
- 이 값을 변경함으로써 이는 눈이나 기름과 같은 미끄러운 표면을 시뮬레이션하기 위해서 사용될 수도 있음( 아마도 폰이 서 있는 재질에 기반해서 설정해야 할 것임 ).
|
MaxWalkSpeed |
- 걸어다닐 때의 최대 속력. 떨어지고 있을 때의 최대 측면( lateral ) 속도를 결정하기도 함.
|
MaxWalkSpeedCrouched |
|
BrakingDecelerationWalking |
- 가속도 없이 걸어 다닐 대의 감속도. 이는 상수값에 의해서 속도를 직접적으로 감소시키는 지속적인 반대방향의 힘이다.
|
CanWalkOffLedges |
- true 이면 캐릭터가 절벽 가장자리( ledge )에서 걸어서 떨어질 수 있음.
|
CanWalkOffLedgesWhenCrouching |
- true 이면 캐릭터가 앉아서 걸어다닐 때 절벽에서 걸어서 떨어질 수 있음.
|
CurrentFloor |
- 캐릭터가 서 있는 바닥에 대한 정보( 걷기 이동시에만 갱신됨 ).
|
MaintainHorizontalGroundVelocity |
- true 이면, 걷기 이동시에 경사로를 올라 가더라도 항상 수평 속도를 유지하는데, 이는 경사로가 아닌 평면에서 이동했을 때보다 더 빠르게 이동하게 만든다.
- false 이면, 경사로가 아닌 평면에서 이동했을 때와 같은 속도로 이동하게 된다.
|
IgnoreBaseRotation |
- 캐릭터가 그것이 서 있는 바닥의 회전을 무시할지 여부.
- true 이면, 캐릭터가 현재 world 회전값을 유지한다.
- false 이면, 캐릭터가 움직이는 바닥의 회전값만큼 회전한다.
|
PerchRadiusThreshold |
- 캐릭터의 캡슐의 가장자리와 표면의 가장자리가 가까울 때 캐릭터가 표면의 가장자리에 걸쳐 있지 못하게 하는 문턱값.
- 걸어다닐 수 있는 표면보다 낮은 값의 MaxStepHeight 를 가지는 캐릭터는 떨어지지 않는다는 것에 주의할 것.
|
PerchAdditionalHeight |
- 절벽 가장자리에 걸쳐 있을 때, MaxStepHeight 에 이 값을 더해서 걸어다닐 수 있는 바닥에서 얼마나 떨어져 있는지를 검사한다.
- 걸어 올라가도록 하기 위해서 MaxStepHeight 강제로 바꿈; 이는 캐릭터를 가장자리에서 떨어지게 하거나 바닥에서 약간 높게 떠서 올라가도록 함.
|
ForceNextFloorCheck |
- 캐릭터가 걷기 이동중 상태일 때 그것이 실제로 이동하지 못했더라도 강제로 유효한 바닥을 검사하도록 함. 다음 바닥 검사 이후에 클리어됨.
- 보통 AlwaysCheckFloor 가 false 일 때는 특정 상황이 발생하지 않는다면 바닥 검사를 피하려고 시도할 필요가 없다. 하지만 이는 다음 검사를 항상 실행하도록 강제하기 위해서 사용됨.
|
LedgeCheckThreshold |
- 폰이 절벽 가장자리로 가서 떨어지는지 여부를 검사하기 위해서 사용됨. 만약 이 값보다 가장자리의 길이가 짧다면 폰은 절벽에서 떨어질 수 있다.
|
AlwaysCheckFloor |
- 캐릭터가 걷고 있는 동안에 stationary character 를 위한 바닥 검사를 항상 강제할 것인지 여부.
- 보통 움직이고 있지 않을 때는 바닥 검사를 피하는 것이 좋다. 하지만 ( 오브젝트들이 캐릭터 위로 타고 올라 가는 상황과 같이 ) 깡총깡총 뛰다가 잘못되는 상황이 존재한다면 바닥 검사를 강제하기 위해서 사용될 수 있다.
|
UseFlatBaseforFloorChecks |
- 캐릭터가 평평한 바닥을 가진 도형을 사용하고 있는 것인양 바닥 검사를 수행함.
- 이는 캐릭터가 절벽 가장자리에서 ( 캡슐이 가장자리에서 균형을 이루는 것처럼 ) 천천히 떨어지는 상황을 방지한다.
|
CharacterMovement : Jumping / Falling
캐릭터가 점프하거나 떨어지고 있는 상황을 제어하는 곳입니다.
이름 |
설명 |
JumpZVelocity |
- 점프할 때 초기 속도( 즉각적인 수직 가속도 ).
|
BrakingDecelerationFalling |
- 떨어질 때 측면 감속도. 가속도에 영향을 주지 않음.
|
AirControl |
- 떨어질 때, 캐릭터에 대해 가능한 측면 이동 제어의 양.
- 0 = 제어 없음. 1 = MaxWalkSpeed 의 최대 값에서 완전한 제어.
|
AirControlBoostMultiplier |
- 떨어질 때, AircontrolBootVelocityThreshold 보다 작은 측면 속도일 때 Aircontrol 에 곱해질 값.
- 이 값을 0 으로 설정하면 air control boosting 이 비활성화됨. 최종 결과는 1 로 잘림.
|
AirControlBoostVelocityThreshold |
- 떨어질 때, 측면 속도의 크기가 이 값보다 작으면, AirControl 에 AirControlBoostMultiplier 가 곱해짐.
- 이 값을 0 으로 설정하면 air control boosting 이 비활성화됨.
|
FallingLateralFriction |
- 떨어질 때, 측면 공중 이동에 적용될 마찰력.
- bUseSeperateBrakingFriction 이 false 이면, ( 가속도가 0 일 때마다 ) 멈출 때 더욱 빠르게 멈추는 능력에 영향을 줌.
|
ImpartBaseVelocityX |
- true 이면, ( 점프를 포함해 ) 떨어지는 것이 끝났을 때 기저 액터의 X 축 속도에 전달됨.
|
ImpartBaseVelocityY |
- true 이면, ( 점프를 포함해 ) 떨어지는 것이 끝났을 때 기저 액터의 Y 축 속도에 전달됨.
|
ImpartBaseVelocityZ |
- true 이면, ( 점프를 포함해 ) 떨어지는 것이 끝났을 때 기저 액터의 Z 축 속도에 전달됨.
|
ImpartBaseAngularVelocity |
- true 이면, 점프나 떨어지는 것이 끝났을 때 기저 컴포넌트의 각속도의 접선( tangential ) 성분에 전달됨.
|
NotifyApex |
- true 이면, 꼭대기( apex )에서 점프할 때 CharacterOwner 의 컨트롤러에 NotifyJumpApex() 이벤트를 전달함. 이는 이벤트가 트리거되면 클리어됨.
|
JumpOffJumpZFactor |
- 캐릭터 밑에 있도록 허용되지 않은 액터로 점프해서 올라갔을 때 사용될 JumpZVelocity 의 분수값( 예를 들어, 여러분이 다른 플레이어의 위에 서 있도록 허용되지 않았다면 ).
|
Character Movement : Swimming
캐릭터가 물에 빠졌을 때의 이동을 제어하는 곳입니다.
이름 |
설명 |
MaxSwimSpeed |
|
BrakingDecelerationSwimming |
- 수영시의 감속도이며 가속도에는 영향을 주지 않음.
|
Buoyancy |
- 물의 부력. 비율( 1.0 = 자연스런 부력, 0.0 = 부력 없음 ).
|
MaxOutOfWaterStepHeight |
|
OutofWaterZ |
- 폰이 물에서 나가려 할 때 적용되는 Z 축 속도.
|
JumpOutofWaterPitch | - 물 속에 있을 때, 이 값 이상의 pitch 각을 올리면 jump 함.
|
Character Movement : Flying
날아 다닐 때의 이동을 제어하는 곳입니다.
이름 |
설명 |
MaxFlySpeed |
|
BrakingDecelerationFlying |
- 비행시의 감속도이며 가속도에는 영향을 주지 않음.
|
Character Movement : Custom Movement
사용자가 커스텀하게 설정하는 이동을 제어하는 곳입니다.
이름 |
설명 |
MaxCustomMovementSpeed |
최대 속력. |
Character Movement : Physics Interaction
캐릭터 이동시 물리의 영향을 어떻게 받을 것인지 설정하는 곳입니다.
이름 |
설명 |
EnablePhysicsInteraction |
- 만약 활성화되면, 걸어다닐 때 플레이어는 물리 개체들과 상호작용함.
|
TouchForceScaledtoMass |
- 만약 활성화되면, TouchForceFactor 가 영향받는 오브젝트의 kg 질량마다 적용됨.
|
PushForceScaledtoMass |
- 만약 활성화되면, PushForceFactor 가 영향받는 오브젝트의 kg 질량마다 적용됨.
|
PushForceUsingZOffset |
- 만약 활성화되면, PushForce 위치가 PushForcePointZOffsetFactor 를 사용해 이동됨. 그렇지 않으면 단순하게 충돌 지점을 사용함.
|
ScalePushForcetoVelocity |
- 만약 활성화되면, 적용된 push force 는 물리개체의 속도를 플레이어의 속도와 같게 만들려고 시도함. 이는 힘을 감소시킬 것이며, PushForceFactor 에 의해 정의된 것보다 더 많은 힘을 적용하지는 않을 것이다.
|
StandingDownwardForceScale |
- 플레이어가 서 있는 개체에 적용되는 힘이 ( 질량과 중력 때문에 ) 이 만큼 스케일링 됨.
|
InitialPushForceFactor |
- 플레이어가 blocking 하는 물리 개체로 튕겨졌을 때 적용하는 초기 충격력( impulse force ).
|
PushForceFactor |
- 플레이어가 blocking 하는 물리 개체와 충돌했을 때 적용할 힘.
|
PushForcePointZOffsetFactor |
- 힘이 적용되는 위치에 대한 Z축 오프셋. 0.0 은 물리 개체의 중심이며, 1.0 은 천장. -1.0 은 바닥.
|
TouchForceFctor |
- 플레이어가 터치했을 때 물리 개체에 적용되는 힘.
|
MinTouchForce |
- 플레이어가 터치한 물리 개체에 적용되는 최소 힘. 만약 0.0 보다 작으면, 최소값 없음.
|
MaxTouchForce |
- 플레이어가 터치한 물리 개체에 적용되는 최대 힘. 만약 0.0 보다 작으면 최대값 없음.
|
RepulsionForce | - 모든 겹쳐있는 요소들에게 지속적으로 적용되는 kg 당 힘.
|