[UE5] #3 - Player-3 | Animation

qweasfjbv·2024년 9월 21일

UnrealEngine5

목록 보기
3/8
post-thumbnail

개요


입력을 받고 캐릭터를 움직일 수는 있지만, 항상 A포즈로 고정되어 어색합니다.
AnimInstance와 BlendSpace를 통해 자연스러운 애니메이션을 적용해보겠습니다.

우선 PlayerCharacterAnimInstance - PlayerGunnerAnimInstance 를 생성합니다.
해당 스크립트에서는 필요한 정보들을 저장/업데이트하고, 그 정보들을 이용하여 BP에서 애니메이션을 조작하겠습니다.

구현


AnimInstance Scripts

AnimInstance 스크립트에서 필요한건 캐릭터 (정확히는 캐릭터의 속도) 에 접근하기 위한 포인터입니다.

UPlayerCharacterAnimInstance : UAnimInstance

/** 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 함수에서 GroundSpeedbHasAcceleration 을 업데이트합니다.
해당 변수들은 BP에서 사용할 예정입니다.

추가적으로, GroundSpeed 는 최대 속도를 고려하여 항상 BlendSpace의 Axis 최댓값이 100이 될 수 있도록 하였습니다.
이 부분은 후에 자세히 보겠습니다.


Anim BP

우선 움직임을 자연스럽게 만들어줄 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을 사용하여 줌인/줌아웃 및 총 쏘는 액션을 만들어보겠습니다.

0개의 댓글