이동
개요
MovementSystem
은 다양한 파라미터가 있는 표면에서 다른 속도로 엔티티를 이동할 수 있는 방법을 제공합니다. MovementDesires
형태의 움직임 입력과 중력이나 점프 충격 같은 외부 힘은 맞춤형 가속도 및 마찰 기반 운동 캐릭터 컨트롤러(약칭 KCC)에 의해 처리됩니다. KCC는 물리 충돌 결과(레이 캐스트/모양 중첩)를 고려하여 이동 델타를 계산하고 그 값을 엔티티의 Transform3D
에 적용합니다.
주의: FPS Template에 포함된 KCC는 완전한 맞춤형 구현이며 기본 Quantum SDK에 포함된 2D 및 3D KCC와는 다릅니다.
FSM
이동 엔진은 유한 상태 기계입니다. 지원되는 상태는 EMovementState
에 구현되어 있습니다.
Idle
: 캐릭터가 서있으며 그리고 땅 위에 있습니다. 아무런 힘이 가해져 있지 않습니다.Moving
: 캐릭터가 이동하며 그리고 땅 위에 있으며 입력과 외부 힘이 적용됩니다.Jumping
: 특수 상태로 점프 후 위로 이동할 때 캐릭터는 땅에서 떨어집니다.Falling
: 캐릭터가 아래로 떨어집니다(또한 점프 후 Y 가속이 0 보다 아래입니다). 캐릭터가 땅에 닿지는 않습니다.Sliding
: 캐릭터가 경사면에서 서있거나 움직입니다. 그리고 땅에 닿아있습니다.Rising
: 외부 힘에 의하여 위로 움직입니다( 점프 아님). 캐릭터가 땅에 닿아있지 않습니다.Floating
: 특별한 힘에 의해 움직이는 특별한 상태로 중력이 무시됩니다.
API
이동을 계산하기 위해 제공되는 API는 다음과 같습니다.
ResetVelocity()
: 현재 이동 속도를 재설정합니다.AddForce()
: 다음Update()
가 호출될 때 힘을 적용합니다. 최종 델타 속도 계산은 내부 상태(표면, 기울기 등)의 영향을 받습니다. 이것은 일정 시간 동안 지속되는 힘을 가하기 위해 호출되어야 합니다.AddImpulse()
: 다음Update()
가 호출될 때 힘을 적용합니다. 최종 델타 속도 계산은 내부 상태(표면, 기울기 등)의 영향을 받습니다. 이것은 일회성 자극을 적용하기 위해 호출되어야 합니다.AddVelocity()
: 다음Update()
를 호출할 때 원시 델타 속도를 적용합니다. 이는 내부 상태(표면, 경사 등)에는 영향을 미치지 않습니다.Teleport()
: 특정한 위치로 순간 이동을 요청합니다. 다음Update()
가 호출될 때 실행됩니다.SetFloating()
: 엔티티를Floating
상태로 전환합니다. 이 상태를 갖는 모든 기간 동안 모든 프레임에서 호출되어야 합니다.
충돌
기본적으로 KCC 이동은 엔티티 자신의 신체 부위를 무시하고 트리거 충돌기와 충돌하지 않습니다. IMovementController
인터페이스를 구현하여 사용자 지정 충돌 해결 방법을 추가할 수 있습니다.
정적 Quantum 콜라이더는 표면 속성을 가질 수 있습니다. 이러한 설정은 정적 충돌기의 Settings > User
에셋 슬롯에 연결되어야 하는 ColliderConfig
에셋에 정의됩니다.
실행 흐름
다음 그림은 MovementSystem
의 로직 실행 흐름의 개요를 개략적으로 나타내고 있습니다.