AnimInstance
스켈레탈 메시를 소유한 폰의 정보를 받아서
Anim Graph 가 참조할 데이터를 제공한다
블루프린트와 C++로 구현 가능하다
AnimInstance의 블루프린트 애셋에는 Anim Graph 기능이 제공된다
Anim Graph
업데이트된 변수 값에 따라 지정된 애니메이션을 재생하고 제어하는 부분이다
상황에 따라 적합한 애니메이션을 체계적으로 재생할 수 있도록
스테이트 머신 기능을 활용할 수 있고
블루프린트로만 구현 가능하다
AnimInstance 생성
폰의 속도에 따라 다른 애니메이션을 재생하기 위해서는
프레임마다 폰의 속력과 AnimInstance의 CurrentSpeed 속성을 연동해야 한다
연동하는 방법은 아래 두 가지가 있다
1. 폰의 Tick() 함수에서 AnimInstance의 CurrentSpeed 속성 업데이트
2. AnimInstance의 Tick() 함수에서 폰의 정보를 가져와서 CurrentSpeed 속성 업데이트
객체 지향 프로그래밍에서는 2번의 형태로 개발하는 것이 좋다
추가적으로
폰에서 AnimInstance를 참조하려면, GetAnimInstance()를 통해 가져올 수 있다
반면, AnimInstance에서 폰을 참조하려면, TryGetPawnOwner()를 통해 가져올 수 있다
그 이유는
게임 플레이 플로우는 Input > Game Logic (Pawn) > Animation의 단계를 거친다
Game Logic 단계에서 Pawn이 사라지는 경우가 발생하고
Animation 단계로 넘어오는 경우가 있기에, AnimInstacne는 Pawn을 TryGet 한다
반면, Game Logic 단계에서 AnimInstance는 항상 존재하기 때문에 Get을 사용한다
// SAnimInstance.h
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "SAnimInstance.generated.h"
/**
*
*/
UCLASS()
class STUDYPROJECT_API USAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
USAnimInstance();
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
protected:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="SAnimInstance", meta=(AllowPrivateAccess))
float CurrentSpeed;
};
// SAnimInstance.cpp
#include "Animation/SAnimInstance.h"
#include "Character/SPlayerCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
USAnimInstance::USAnimInstance()
{
}
void USAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
ASCharacter* OwnerCharacter = Cast<ASCharacter>(TryGetPawnOwner());
if (IsValid(OwnerCharacter) == true)
{
UCharacterMovementComponent* CharacterMovementComponent = OwnerCharacter->GetCharacterMovement();
if (IsValid(CharacterMovementComponent) == true)
{
CurrentSpeed = CharacterMovementComponent->GetLastUpdateVelocity().Size();
}
}
}
Tip 1
애님 그래프의 노드의 연결을 끊는 단축키는
alt를 누른 상태로 노드를 클릭하면 된다
Tip 2
애님 그래프뿐만 아니라 블루프린트에서
컴파일 시에 자동 저장 기능을 활용해서 설정하면 편하다
Tip 3
SAnimInstance 클래스의 속성이 보이지 않는 경우에는
설정을 통해 변수를 노출시킬 수 있다
Tip 4
조건에 따른 다른 애니메이션을 작동하게 하고 싶다면
Blend Poses by bool을 사용하면 된다
Tip 5
애니메이션 종료 시 자동으로 스테이트가 전환되게 하려면,
Automatic Rule Based on Sequence Player in Slate 속성을 사용하거나
Time Remaining 노드를 활용할 수도 있다
'게임 엔진 > [코드조선] 언리얼' 카테고리의 다른 글
언리얼 Animation - Animation Montage (0) | 2024.05.14 |
---|---|
언리얼 Animation - State Machine (0) | 2024.05.14 |
언리얼 View - Control Rotation (0) | 2024.05.14 |
언리얼 Character - Character 클래스 생성 (0) | 2024.05.13 |
언리얼 Character - Enhanced Input System (0) | 2024.05.13 |