[39. The Animation Blueprint #1]
블렌드 스페이스: 애니메이션을 섞는다.
1D는 축이 한개이다.
![](https://blog.kakaocdn.net/dn/rwD10/btrLtXYhzbY/ZQ6fy96mBC0vYGSGIi8xk0/img.png)
좌측부터 Idle, Walk, Running을 배치하고 가로 축 이름은 Speed, 최대값은 375로 설정한다.
애니메이션 그래프에서는 매 틱마다 무언가를 할 수 있다.
AnimInstance를 상속하는 MainAnimInstance C++ 클래스를 만들어준다.
참고로 애니메이션 인스턴스는 틱 함수가 없지만 비슷한 것은 있다.
// MainAnimInstance.h
class FIRSTPROJECT_API UMainAnimInstance : public UAnimInstance
{
public:
virtual void NativeInitializeAnimation() override;
UFUNCTION(BlueprintCallable, Category = AnimationProperties)
void UpdateAnimationProperties();
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
float MovementSpeed;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
bool bIsInAir;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Movement)
class APawn* Pawn;
};
// MainAnimInstance.cpp
#include "GameFramework/CharacterMovementComponent.h"
void UMainAnimInstance::NativeInitializeAnimation()
{
if (Pawn == nullptr)
{
// 이 애니메이션 인스턴스의 소유자를 가져옴
Pawn = TryGetPawnOwner();
}
}
void UMainAnimInstance::UpdateAnimationProperties()
{
if (Pawn == nullptr)
{
Pawn = TryGetPawnOwner();
}
if (Pawn)
{
FVector Speed = Pawn->GetVelocity();
FVector LateralSpeed = FVector(Speed.X, Speed.Y, 0.f);
MovementSpeed = LateralSpeed.Size();
bIsInAir = Pawn->GetMovementComponent()->IsFalling();
}
}
우선은 코드를 작성하고 끝내도록 한다. 아직 바뀌는건 아무것도 없다.
NativeInitializeAnimation은 AnimInstance에 선언 및 정의가 되어있기는 한데 아무것도 구현되어있지 않다.
필요하면 재정의 해서 쓰라고 만들어 둔 듯 하다.
[40. The Animation Blueprint #2]
MainAnimInstance기반의 애니메이션 블루프린트 클래스를 하나 만들어 준다. 이름은 MainAnim_BP이다.
이번에는 따로 코드를 작성하지 않고 블루프린트로만 애니메이션이 작동하게 만든다.
![](https://blog.kakaocdn.net/dn/cmvoul/btrLuyRgJeN/TB3Kpixkgjmn9T7eWxTni0/img.png)
먼저, 이벤트그래프에서 만들어둔 UpdateAnimationProperties 함수를 이벤트에 연결시킨다.
해당 이벤트는 매 틱 실행되어 캐릭터의 속도의 크기를 MovementSpeed에 대입한다.
![](https://blog.kakaocdn.net/dn/bJOZUg/btrLu8rhbMg/ag4Cb5r0kT0o4GNKRbmoLk/img.png)
AnimGraph에서 스테이트 머신을 만들고 안으로 들어간다.
![](https://blog.kakaocdn.net/dn/wtIZh/btrLqXxNHEz/iuJKXPpfk3PputW2wHfki1/img.png)
Idle/Walk/Run이라는 스테이트를 만들어서 엔트리와 연결시켜준다.
다시 Idle/Walk/Run 안으로 들어간다.
![](https://blog.kakaocdn.net/dn/6JGCM/btrLqXR2jXe/1kASHSpL7e8RMXJ6AQkud0/img.png)
애셋 브라우저에서 기존에 만들었던 블렌드 스페이스 1D를 가져와서 출력 애니메이션 포즈에 연결시키고 MovementSpeed를 매개변수로 넘겨준다.
UpdateAnimationProperties 함수가 매 틱 실행되어 캐릭터의 속도에 따라 MovementSpeed 값이 변하기 때문에 블렌드 스페이스에서 설정한 값(0~375)에 따라 애니메이션 블렌드가 적절하게 이뤄진다.
이제 실행 후 캐릭터를 이리저리 움직여보면 어느정도 의도한 대로 애니메이션이 재생된다.
[41. The Animation Blueprint #3]
점프 애니메이션을 추가할 때이다.
![](https://blog.kakaocdn.net/dn/vOO86/btrLwAU9P7E/80Ipj5vmTOOd9yD5ymMBQ1/img.png)
스테이트 머신을 위와 같이 설정한다.
JumpStart에는 Jumping_Up, InAir에는 Falling_Idle, JumpEnd에는 Jumping_Down 애니메이션을 연결시켜준다.
이제 현재 상태나 애니메이션 재생 비율에 따라 장면 전환을 정하면 된다.
![](https://blog.kakaocdn.net/dn/kUsIj/btrLwJq1BoE/kDclokvjzGTP9AMIRWi3Y1/img.png)
어느정도 의도한 대로 애니메이션 전환이 잘 이뤄진다.
원하는 동작이 복잡해질수록 전환 규칙을 많이 정의해야 한다.
'언리얼 엔진 > UE4 C++' 카테고리의 다른 글
[UE C++] Gameplay Mechanics #2 (0) | 2022.09.07 |
---|---|
[UE C++] Gameplay Mechanics #1 (0) | 2022.09.06 |
[UE C++] The Character Class #1 (0) | 2022.09.05 |
[UE C++] The Pawn Class #2 (0) | 2022.09.05 |
[UE C++] The Pawn Class #1 (0) | 2022.09.04 |