이득우의 언리얼 C++ 게임 개발의 정석의 Chapter07 요약입니다.

애니메이션 블루프린트

  • 캐릭터가 다양한 상황에서 적절한 애니메이션을 체계적으로 재생하기 위해 애니메이션 블루프린트를 제공, 애님 인스턴스와 애님 그래프로 구성됨
    • 애님 인스턴스 : 스켈레탈 메시를 소유하는 폰의 정보를 받아 애님 그래프가 참조할 데이터를 제공한다. 블루프린트와 C++로 제작할 수 있다.
    • 애님 그래프 : 애님 인스턴스의 변수 값에 따라 변화하는 애니메이션 시스템을 설계하는 공간이다. 블루프린트로만 제작할 수 있다.
  • 블루프린트 접근 키워드 : BlueprintReadOnly, BlueprintReadWrite

폰과 데이터 연동

  • 애님 인스턴스 클래스는 틱마다 호출되는 NativeAnimationUpdate 함수를 가상함수로 제공한다.
    void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds) {
      Super::NativeUpdateAnimation(DeltaSeconds);
    
      auto Pawn = TryGetPawnOwner();
      if (::IsValid(Pawn)) {
          CurrentPawnSpeed = Pawn->GetVelocity().Size();
      }
    }
    
  • 게임 엔진은 틱마다 입력 시스템 > 게임 로직 > 애니메이션 시스템순으로 로직을 실행한다. 이는 플레이어의 의지인 입력 값을 받은 후 그것을 해석해 폰을 움직이게 만들고, 폰의 최종 움직임과 맞는 애니메이션을 재생시키는 것이 자연스럽기 때문이다. 만일 애니메이션에 앞서 실행되는 게임 로직 단계에서 폰이 제거하는 명령을 내린다면 그 뒤에 실행되는 애니메이션 로직에서는 더 이상 유효하지 않은 폰 객체를 참조하게 될 것이다. 그래서 애니메이션 시스템은 폰에 접근할 때 먼저 폰 객체가 유효한지 점검해야 한다. 이를 검사하는 명령이 TryGetPawnOwner이다.

스테이트 머신의 제작

  • 상황에 따라 복잡한 애니메이션 시스템을 체계적으로 설계할 수 있도록 애니메이션 블루프린트의 애님 그래프는 스테이트 머신(유한 상태 기계)이라는 기능을 제공한다.
  • 스테이트 머신은 스테이트를 정의하는 것부터 시작, 스테이트 머신은 그중 하나를 정해 해당 스테이트에서 지정한 동작을 반복 수행하는 것
    • 스테이트 : 기계가 반복 수행해야 하는 동작을 설계하는 단위, 애니메이션 스테이트에서는 캐릭터가 반복해서 재생해야 할 애니메이션 동작이라고 할 수 있다.
    • 트랜지션 : 하나의 스테이트에서 다른 스테이트로 이동하기 위한 조건

점프 기능 구현

  • 언리얼 엔진의 캐릭터 모델은 캐릭터 무브먼트 컴포넌트를 기본적으로 탑재하고 있다. 대표적인 기능으로는 점프가 있다.
  • ACharacter 클래스에는 이미 Jump라는 멤버함수가 있다. 이를 연동하면 캐릭터의 점프 기능이 완성된다.
  • JumpZVelocity의 기본값을 변경하면 점프 높이 값이 변화한다.
  • 움직임을 파악하기 위해 폰의 무브먼트 컴포넌트가 제공하는 함수들
    • IsFalling() : 현재 공중에 떠있는지
    • IsSwimming() : 현재 수영 중인지
    • IsCrouching() : 현재 앉아있는지
    • IsMoveOnGround() : 땅 위에서 이동 중인지
  • FloatingPawnMovement 컴포넌트는 위의 함수들이 모두 false처리 되어있다.

애니메이션 리타겟

  • 언리얼 엔진은 인간형 캐릭터의 경우 스켈레톤 구성이 달라도 애니메이션을 교환할 수 있도록 애니메이션 리타겟 기능을 제공한다.

점프의 구현

  • 점프 동작은 지형에 따라 체공 시간이 다르므로 지형을 고려해서 점프 기능을 구현 하려면 점프 동작을 도약, 체공, 착지로 나누고 상황에 맞게 애니메이션 재생 시간을 조절해줘야 한다.
  • 애니메이션 재생을 모두 종료하고 스테이트를 이동하는 경우에는 트랜지션의 로직을 구현할 필요 없이 트랜지션 노드에서 제공하는 Automatic Rule Based On Sequence Player State 옵션을 체크하면 애니메이션 종료 시 자동으로 스테이트가 전환된다.