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