이 글은 Inflearn - Rookiss : 언리얼 엔진4 입문 강의를 듣고 정리한 글입니다.
목차.
블렌드 스페이스란?
블렌드 스페이스 : Blend Space, 블렌드 스페이스는 여러 입력값에 따라 몇 개의 애니메이션도 서로 블렌딩할 수 있게 만들어주는 애셋입니다.
블렌드 스페이스 (Blend Space) 는 애님 그래프에서 샘플링할 수 있는 특수 애셋으로, 두 입력값에 따라 애니메이션을 블렌딩 시켜 주는 것입니다. 하나의 입력에 따라 두 애니메이션을 섞는 단순 블렌딩은 애니메이션 블루프린트에서 쓸 수 있는 표준 블렌드 노드를 사용하면 됩니다. 블렌드 스페이스를 통해 (현재는 둘로 제한되어 있지만) 다수의 값에 따라 다수의 애니메이션을 블렌딩 하는 복잡한 작업을 할 수 있습니다.
블렌드 스페이스의 목적은 특정 속성이나 조건에 따라 블렌딩을 할 때마다 별개의 노드를 하드코딩하여 만드는 노고를 덜기 위함입니다. 입력, 애니메이션, 애니메이션끼리의 블렌딩을 위해 입력을 어떻게 사용할 것인지 등을 애니메이터나 프로그래머가 지정할 수 있도록 하여, 사실상 어떤 유형의 블렌딩도 범용 블렌드 스페이스를 사용해서 이뤄낼 수 있습니다.
간단하게 설명하자면 단순하게 걷는 애니메이션도 한 종류만 있는 게 아니라 옆으로 걷기, 뒤로 걷기, 대각선으로 걷기 등 다양한 종류가 있는데 이를 하나하나 조건문으로 제어하는 것은 비효율적입니다 이럴 때 블렌드 스페이스를 활용할 수 있습니다.
유니티로 예를 들자면 애니메이션 블렌드 트리와 거의 동일한 역할을 해줍니다.
블렌드 애니메이션 설정
애니메이션 -> 블렌드 스페이스 선택을 해서 하나 생성해 줍니다.
바로 아래에 블렌드 스페이스 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에 맞도록 적절히 앞, 뒤, 좌, 우 걷기 애니메이션을 배치했습니다.
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와 연결해 주면 끝입니다.
'언리얼' 카테고리의 다른 글
[UE4] Skeletal Mesh Socket 무기 장착 (1) | 2023.08.28 |
---|---|
[UE4] Collision 충돌처리 (0) | 2023.08.28 |
[UE4] 언리얼 엔진 기초 : 애니메이션 노티파이 (0) | 2023.08.24 |
[UE4] 언리얼 엔진 기초 : 델리게이트(Delegate) (0) | 2023.08.23 |
[UE4] 언리얼 엔진 기초 : 애니메이션 몽타주(Animation Montage) (0) | 2023.08.23 |