본문 바로가기

인생언리얼TPS

3.2 블렌드스페이스를 이용한 애니메이션 합성

이제 좌우 움직임을 표현해야 하지만 잘 생각해보면 360도 방향을 표현하려면 좌우 애니메이션 2가지로는 부족합니다. 관리도어렵습니다. 이럴 경우 사용하는 것이 블렌드스페이스 입니다.

블루프린트>Animation>BlendSpace를 선택해 BS_PlayerMove로 만듭니다.

블렌드스페이스는 이제 2축으로 밖에 만들수 없습니다. 한쪽은 스피드, 다른쪽은 Direction으로 만듭니다..

Asset에서 Idle은 가운데 Walk4개는 상하좌우에 배치합니다 .Dicrection쪽이 좌우 입니다.

이제 PlayerAnim.h에 direction변수를 추가해줍니다.

	UPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category = PlayerAnim)
	float direction = 0;

PlayerAnim.cpp에 rightVector와 velocity의 Dot연산을 해주어 direction변수를 갱신해줍니다.

		FVector rightVector = player->GetActorRightVector();
		direction = FVector::DotProduct(rightVector, velocity);

 

ABP_Player에서 앞뒤 이동부분을 삭제합니다.

BS_BlendMove를 끌어다 다시 연결해 줍니다.  조건도 설정해줍니다.

이름을 Move로 바꿔주고 더블클릭으로 들어갑니다.

Direction, Speed변수를 연결해준다.

플레이해보면 속도에 비해 애니메이션이 미끄러지듯이 움직여서 걷는 속도를 줄여줍니다.

TPSPlayer.h에 변수를 추가해준다.

	UPROPERTY(EditAnywhere, Category = BulletEffect)
	float walkSpeed = 200;
	UPROPERTY(EditAnywhere, Category = BulletEffect)
	float runSpeed = 600;

TSPPlayer.cpp에 ChracterMovementComponent.h를 추가하고 MaxwalkSpeed를 200으로 한다.

#include <GameFramework/CharacterMovementComponent.h>
void ATPSPlayer::BeginPlay()
{
	Super::BeginPlay();
	//초기 속도를 걷기로 설정
	GetCharacterMovement()->MaxWalkSpeed = walkSpeed;

이제 달리게도 만들어 보겠습니다.

TPSPlayer.h에 void InputRun()을 public으로 추가합니다. InputAction도 추가해줍니다.

void InputRun();	
UPROPERTY(EditAnywhere, Category = "Input")
UInputAction* RunIA;

TPSPlayer.cpp에 입력을 2개 바인딩 해두는데 하나는 눌렸을때 하나는 떨어졌을때 입니다. 바인딩된 함수는 InputRun()으로 똑같은데 MaxWalkSpeed를 체크해서 바꿔줍니다.

Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInputComponent = CastChecked<UEnhancedInputComponent>(PlayerInputComponent))
{
//생략
    EnhancedInputComponent->BindAction(RunIA, ETriggerEvent::Started, 
    	this, &ATPSPlayer::InputRun);
    EnhancedInputComponent->BindAction(RunIA, ETriggerEvent::Completed, 
    	this, &ATPSPlayer::InputRun);
//생략

void ATPSPlayer::InputRun()
{
	auto movement = GetCharacterMovement();
	if (movement->MaxWalkSpeed > walkSpeed) {
		movement->MaxWalkSpeed = walkSpeed;
	}
	else {
		movement->MaxWalkSpeed = runSpeed;
	}
}

IA_RUN inputAction을 만들어 줍니다. Value Type은 Digital(bool)로 하고

IMC_Default에 넣어줍니다. LeftShift를 지정해줍니다.

ABP_Player를 열어 Walk는 200에 재배치하고 Jog를 검색해서 walk자리에 배치해줍니다.