• 게임엔진은 틱마다 입력 시스템 > 게임로직 > 애니메이션 시스템순으로 로직을 실행한다.
  • 플레이어의 의지인 입력 값을 받은 후 그것을 해석해 폰을 움직이게 만들고, 폰의 최종 움직임과 맞는 애니메이션을 재생시키는 것이 자연스럽기 떄문이다.
  • 애니메이션에 앞서 폰을 제거 한다면, 애니메이션 로직은 더 이상 유효하지 않은 객체를 참조하게 된다
  • 그래서 폰 객체를 확인하는 함수 TryGetPawn()을 사용한다

NativeAnimationUpdate 함수

  • 애님인스턴스 클래스에서 매틱 마다 호출을 한다.
  • 호출은 되나, 타고가서 보면 내용은 아무 것도 없음
  • 이를 재정의해서 매 틱 호출

애니메이션에서 폰의 정보를 가져오서 속도를 적용

//cpp
class KGAME_API UABAnimInstance : public UAnimInstance
{
    GENERATED_BODY()

public:
    UABAnimInstance();
    virtual void NativeUpdateAnimation(float DeltaSeconds) override;
private:
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
    float CurrentPawnSpeed;

};
UABAnimInstance::UABAnimInstance()
{
    CurrentPawnSpeed = 0.0f;
}


void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
    Super::NativeUpdateAnimation(DeltaSeconds);
    auto Pawn = TryGetPawnOwner();                     
    if (::IsValid(Pawn))
    {
        CurrentPawnSpeed = Pawn->GetVelocity().Size();
    }

}

폰에서 애니메이션을 불러와 속도를 적용

//애님인스턴스.h
UCLASS()
class KGAME_API UABAnimInstance : public UAnimInstance
{
    GENERATED_BODY()

public:
    UABAnimInstance();
    virtual void NativeUpdateAnimation(float DeltaSeconds) override;
    void SetPawnSpeed(float NewPawnSPeed) { CurrentPawnSpeed = NewPawnSPeed; }
private:
    UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
    float CurrentPawnSpeed;
};
//캐릭터 cpp
void AABCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

 . . .

    auto ABInstance = Cast<UABAnimInstance>(GetMesh()->GetAnimInstance());
    if (ABInstance != nullptr)
    {
        ABInstance->SetPawnSpeed(GetVelocity().Size());
    }
}

'Unreal > Game 1 (C++)' 카테고리의 다른 글

9.애니메이션 몽타주  (1) 2019.05.02
8.점프구현 / 캐릭터 상태체크  (0) 2019.05.02
6.3인칭 컨트롤 구현 (디아블로방식)  (0) 2019.05.02
6.3인칭 컨트롤 구현 (GTA 방식)  (0) 2019.05.02
5.캐릭터 생성  (0) 2019.05.02

+ Recent posts