728x90
이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.

 

목차.

  1. 블렌드 스페이스란?
  2. 블렌드 애니메이션 설정
  3. C++ 클래스 코드 작성

 

블렌드 스페이스란?

 

블렌드 스페이스 : Blend Space, 블렌드 스페이스는  여러 입력값에 따라 몇 개의 애니메이션도 서로 블렌딩할 수 있게 만들어주는 애셋입니다.

 

블렌드 스페이스 (Blend Space) 는 애님 그래프에서 샘플링할 수 있는 특수 애셋으로, 두 입력값에 따라 애니메이션을 블렌딩 시켜 주는 것입니다. 하나의 입력에 따라 두 애니메이션을 섞는 단순 블렌딩은 애니메이션 블루프린트에서 쓸 수 있는 표준 블렌드 노드를 사용하면 됩니다. 블렌드 스페이스를 통해 (현재는 둘로 제한되어 있지만) 다수의 값에 따라 다수의 애니메이션을 블렌딩 하는 복잡한 작업을 할 수 있습니다.

 

블렌드 스페이스의 목적은 특정 속성이나 조건에 따라 블렌딩을 할 때마다 별개의 노드를 하드코딩하여 만드는 노고를 덜기 위함입니다. 입력, 애니메이션, 애니메이션끼리의 블렌딩을 위해 입력을 어떻게 사용할 것인지 등을 애니메이터나 프로그래머가 지정할 수 있도록 하여, 사실상 어떤 유형의 블렌딩도 범용 블렌드 스페이스를 사용해서 이뤄낼 수 있습니다.

 

 

블렌드 스페이스

Blend Space, 블렌드 스페이스는 여러 입력값에 따라 몇 개의 애니메이션도 서로 블렌딩할 수 있게 만들어 주는 애셋입니다.

docs.unrealengine.com

 

간단하게 설명하자면 단순하게 걷는 애니메이션도 한 종류만 있는 게 아니라 옆으로 걷기, 뒤로 걷기, 대각선으로 걷기 등 다양한 종류가 있는데 이를 하나하나 조건문으로 제어하는 것은 비효율적입니다 이럴 때 블렌드 스페이스를 활용할 수 있습니다.

 

유니티로 예를 들자면 애니메이션 블렌드 트리와 거의 동일한 역할을 해줍니다.

 

 

블렌드 애니메이션 설정

 

애니메이션 -> 블렌드 스페이스 선택을 해서 하나 생성해 줍니다.

바로 아래에 블렌드 스페이스 1d도 있는데 위에 있는 블렌드 스페이스를 사용할 것입니다.

 

블렌드 스페이스 생성

생성한 블렌드 스페이스를 보면 에셋 디테일 창에 Axis Setting -> 가로축, 세로축이 있습니다.

각각 가로축은 이름을 Horizontal, 세로축은 이름을 Vertical로 해주고,

Minimum Axis Value는 둘 다 -1

Maximum Axis Value는 둘다 1로 설정해 줍니다.

 

에셋 디테일 창에서 값 수정

 

이름과 값으로 유추할 수 있듯 앞으로 가기 위해 W키를 누르면 Vertical의 값이 1이 되고 뒤로 가기 위해 S를 누르면 -1이 되도록 할 것입니다.

 

이제 애니메이션을 Axis와 Value에 맞게 배치를 해야 합니다.

창을 보면 Vertical과 Horizontal로 이름이 바뀐 것을 볼 수 있습니다.

 

그리고 Interpolation Time이라고 있는데 이것은 전에 애니메이션 트렌지션과 마찬가지로 애니메이션의 전환 시간이라고 보면 됩니다.

이 값이 높을수록 애니메이션 전환이 블렌딩 되어 부드럽게 전환되는데 저는 0.1로 설정해 주었습니다.

 

애니메이션은 지금까지 한 것처럼 에셋 브라우저 창에서 드래그 & 드롭으로 배치할 수 있습니다.

 

Horizontal이 0, Vertical이 -1 : 플레이어가 뒤로 가고 있다는 뜻으로 뒤로 걷는 애니메이션을,

다른 것도 마찬가지로 Axis와 Value에 맞도록 적절히 앞, 뒤, 좌, 우 걷기 애니메이션을 배치했습니다.

 

Horizontal과 Vertical에 맞춰서 애니메이션을 적절히 배치

 

C++ 클래스 코드 작성

 

이제 Horizontal값과 Vertical값을 제어해 줄 코드를 작성해 보겠습니다.

 

MyCharacter.h

.....
public:
	UPROPERTY()
	float UpDownValue = 0;
	UPROPERTY()
	float LeftRightValue = 0;
};

 

지금까지 키 입력을 했을 때 플레이어를 이동시켜 준 함수에서 위 변수를 제어해 주겠습니다.

 

MyCharacter.cpp

void AMyCharacter::UpDown(float Value)
{
	UpDownValue = Value;
	AddMovementInput(GetActorForwardVector(), Value);
}

void AMyCharacter::LeftRight(float Value)
{
	LeftRightValue = Value;
	AddMovementInput(GetActorRightVector(), Value);
}

 

이제 키 입력에 맞게 두 변수의 값이 할당될 것입니다.

이제 이 값을 활용해서 애니메이션을 제어해야 합니다.

 

MyAnimInstance.h

private:
.....
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	float Horizontal;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
	float Vertical;
};

 

MyAnimInstance.cpp

void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);
....
	Vertical = Character->UpDownValue;
	Horizontal = Character->LeftRightValue;
}

 

cpp 코드에서 다른 코드들이 많이 생략되었지만 핵심코드만 적어두었습니다.

Character의 변수에 접근해서 Vertical, Horizontal에 할당해 주었습니다.

여기서 중요한 것은 Character의 변수에 접근하기 위해서는 public으로 선언해야 한다는 것입니다.

 

이제 실행하면 될 것 같지만 아직 해야 할 작업이 남았습니다.

 

애니메이션 블루프린트 창에서 블렌드 스페이스를 이용

 

기존에 Ground 스테이트일 때 Speed가 0보다 크다면 걷기 애니메이션을 작동시켰지만 이제는

블렌드 애니메이션이 작동되게 해줄 것입니다.

 

에셋 브라우저에 보면 조금 전에 생성해둔 블렌드 스페이스가 보이는데 드래그&드롭으로 추가해 주고,

Horizontal과 Vertical을 Get 해서 연결해 주고 블렌드 스페이를 true와 연결해 주면 끝입니다.

 

4개의 애니메이션이 블렌드되어 잘 작동된는 모습

728x90

+ Recent posts