참고자료

 

 

Character Movement 기본 구조

 

Character Movement 네트워크 구조

Architecture & Example

 

클라이언트 / 서버 파이프라인
  • Check or Input Vector ( from controller.h → [Possess Actor or Binded? ] movementComponent.h? )
  • Controlled Character Move (State adjust) ( movementComponent.h → [movementComp→UpdatedComponent] collisionComponent(or any component which have Location)]
    • delta Time + input Vector 
    • [Input] Vector → [Output] Acceleration ( temporary )
  • Perform Move
    • calc Acceleration → force/Impulse
  • Start New Physics
    • calc force/Impulse → velocity → location ( depend on movement Mode )

 Character movement compoent 구성

하위프로퍼티 변경 -> 물리처리 phase에서 movement mode체크 -> 해당 movement mode의 연산식에의해, 상위프로퍼티 산출 -> movement

 

movement mode

  • character movement component → movement mode
    • 틱마다 호출 ( movement mode == phys_... )
      • Tick → (root motion, movement, etc...) → StartNewPhysics → <UEnum> MovementMode → Phys{None/Walking 등등}
    • Mode 전환 호출
      • SetMovementMode( movementmode, custom enum )
    • 변환시 처리
      • OnMovementModeChanged
        • prev movement mode를 기반으로 종료되는 mode에 대한 처리
        • 만약 시작될때를 기점으로 하고싶다면, setmovementmode가 호출되는 조건 ( IsClimbing등 별도 변수 )를 기준으로 사용하는 듯

 

 

 

Add Force

더보기
void UCharacterMovementComponent::AddForce( FVector Force )
{
    if (HasValidData() && !Force.IsZero())
    {
        if (Mass > SMALL_NUMBER)
        {
            PendingForceToApply += Force / Mass;
        }
        else
        {
            UE_LOG(LogCharacterMovement, Warning, TEXT("Attempt to apply force to zero or negative Mass in CharacterMovement"));
        }
    }
}

 

[Character] BP에서 movementComponent는 root component를 제어함

  • ACharacter class에서 할당
더보기
ACharacter::ACharacter(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
    // ...
 
    RootComponent = CapsuleComponent;
 
    // ...
 
    CharacterMovement = CreateDefaultSubobject<UCharacterMovementComponent>(ACharacter::CharacterMovementComponentName);
    if (CharacterMovement)
    {
        CharacterMovement->UpdatedComponent = CapsuleComponent;
        CrouchedEyeHeight = CharacterMovement->CrouchedHalfHeight * 0.80f;
    }
 
    // ...
 
}

 

프레임 내 최종 위치 결정 순서

 

'Unreal > UE Feature' 카테고리의 다른 글

Projectile & Spline  (0) 2024.05.17
AI  (0) 2024.05.17
Texture  (0) 2024.05.17
Modeling  (0) 2024.05.17
Physics  (0) 2024.05.16

+ Recent posts