
입력을 받고 캐릭터를 움직일 수는 있지만, 항상 A포즈로 고정되어 어색합니다.
AnimInstance와 BlendSpace를 통해 자연스러운 애니메이션을 적용해보겠습니다.
우선 PlayerCharacterAnimInstance - PlayerGunnerAnimInstance 를 생성합니다.
해당 스크립트에서는 필요한 정보들을 저장/업데이트하고, 그 정보들을 이용하여 BP에서 애니메이션을 조작하겠습니다.
AnimInstance 스크립트에서 필요한건 캐릭터 (정확히는 캐릭터의 속도) 에 접근하기 위한 포인터입니다.
/** Header File **/
public:
virtual void NativeInitializeAnimation() override;
virtual void NativeThreadSafeUpdateAnimation(float DeltaSeconds) override;
protected:
UPROPERTY()
APlayerBaseCharacter* OwningCharacter;
UPROPERTY()
UCharacterMovementComponent* OwningMovementComponent;
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category="AnimData|LocomotionData")
float GroundSpeed;
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "AnimData|LocomotionData")
bool bHasAcceleration;
/** cpp File **/
void UPlayerCharacterAnimInstance::NativeInitializeAnimation()
{
OwningCharacter = Cast<APlayerBaseCharacter>(TryGetPawnOwner());
if (OwningCharacter) {
OwningMovementComponent = OwningCharacter->GetCharacterMovement();
}
}
void UPlayerCharacterAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
if (!OwningCharacter || !OwningMovementComponent) return;
GroundSpeed = OwningCharacter->GetVelocity().Size2D() * 100 / OwningCharacter->GetMovementComponent()->GetMaxSpeed();
bHasAcceleration = OwningMovementComponent->GetCurrentAcceleration().SizeSquared2D() > 0.f;
}
TryGetPawnOwner() 와 GetCharacterMovement 로 컴포넌트를 얻어 저장해둡니다.
해당 컴포넌트를 통해 캐릭터의 이동속도를 알 수 있고, NativeThreadSafeUpdateAnimation 함수에서 GroundSpeed와 bHasAcceleration 을 업데이트합니다.
해당 변수들은 BP에서 사용할 예정입니다.
추가적으로, GroundSpeed 는 최대 속도를 고려하여 항상 BlendSpace의 Axis 최댓값이 100이 될 수 있도록 하였습니다.
이 부분은 후에 자세히 보겠습니다.
우선 움직임을 자연스럽게 만들어줄 BlendSpace1D부터 설정하겠습니다.

왼쪽의 가로축의 이름을 GroundSpeed로 해주고 중간의 그래프에서 왼쪽 끝에는 IDLE 애니메이션, 오른쪽 끝에는 JOG 애니메이션을 설정합니다.
GroundSpeed가 0~100 사이에서 움직일 때마다 IDLE과 JOG사이에서 Blend 됩니다.

이제 스켈레톤과 부모 클래스를 설정하고 Anim BP 를 만듭니다.

BP에서 state machine을 만들고 SM 안에서 간단한 애니메이션을 만들어봅시다.

IDLE, JOG 애니메이션을 두고 그 둘을 이어줍니다.

IDLE -> JOG 로 가는 조건은 위 스크립트에서 만든 bHasAcceleration 변수를 사용하여 설정합니다.
JOG는 이동 속도에 따라서 걷는 모션을 조절하기 위해 방금 만든 BlendSpace를 사용합니다.
마지막으로 캐릭터 BP에 AnimClass 를 설정합니다.

이렇게까지 하면 자연스러운 움직임을 볼 수 있습니다.

이번에는 캐릭터에 애니메이션을 적용시켰습니다.
다음에는 GameplayAbilitySystem을 사용하여 줌인/줌아웃 및 총 쏘는 액션을 만들어보겠습니다.