favicon Jay Lee DevLog

저번 글에서 삽질을 좀 오래하는 바람에 점프가 빠져서

이번 글에서 점프를 추가하려 한다.

(글 쓰다가 중간에 한번 다 날려먹어서 다시 써야한다.. 저장의 중요성..)

 

먼저 State machine이라는 걸 애님 블루프린트에 추가해줘야 한다.

추가한 이후에 더블클릭하면 아래와 같은 화면이 나오고,

여기서 마우스 우클릭 하여 State를 추가해준다.

State는 특정 동작에 대한 세부적인 부분을 나누고 싶을때 사용하고 나는 아래와 같이 정의했다.

여기서 Ground에는 전 글에서 추가한 내용을 그대로 잘라내서 붙여넣어 줄거다.

그렇게 하면 내가 정의한 Ground는 땅에서 가만히 서있을때 부터 움직일 때의 동작까지의 State가 되는 것이다.

Ground를 편집하려면 더블클릭 해주면 된다. Ground의 완성된 모습은 아래와 같다.

위의 그림에서 Default Moving은 내가 추가해준 State Machine의 이름이고, 그 안에 있는 Ground에 해당 내용을 추가했다. 이렇게 하고 다시 플레이하면 기존 동작과 같게 움직일 것이다.(물론, 실제로 플레이는 안되고 오류가 나는데, Jump등을 정의해주지 않아서 그렇다.)

 

이제 나머지 Jump부터 순서대로 더블클릭하여 동작을 정의해주면 된다. 먼저 Jump다.

Jump를 추가하기 전에 먼저 소스작업을 좀 해줘야 하는데, 공중에 떠있는 상태를 알기 위해서이다.

먼저 MyAnimInstance.h에 아래와 같이 추가한다. 

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

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))는 다시 설명하면 블루프린트에 옵션값에 따라 속성을 추가해주거나 편집가능하게 해주거나 하는 부분이다.

IsInAir는 공중상태 플래그로 넣어줬다.

 

MyAnimInstance.cpp

UMyAnimInstance::UMyAnimInstance()
{
...
	IsInAir = false;
}
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	auto Pawn = TryGetPawnOwner();
	if (::IsValid(Pawn))
	{
		CurrentPawnSpeed = Pawn->GetVelocity().Size();
		
		auto Character = Cast<ACharacter>(Pawn);
		if (Character)
		{
			IsInAir = Character->GetMovementComponent()->IsFalling();
		}
	}
}

위의 코드를 추가해준다.

여기서 IsInAir = Character->GetMovementComponent()->IsFalling(); 가 핵심인데,

캐릭터의 MovementComponent에서 Falling을 알아서 체크해서 리턴해준다. 즉 True면 공중 상태인 것이다.

이후 라이브 코딩을 통해 컴파일 해준다.

 

이제 각각의 State에 알맞는 애니메이션을 넣어주면 된다.

각 State에 애니메이션을 다 추가 했다면,

이제 룰을 추가해 줄건데, 룰은 Ground에서 Jump로 가는 조건을 넣는다 라고 생각하면 된다.

아래와 같이 더블클릭

더블클릭 한 후 아래와 같이 내가 추가한 IsInAir 변수를 추가해준다.

Jump->Fall의 룰에는 아래와 같이 추가해주는데,

Jump가 끝나기까지 남은 값을 리턴해주는 조건이고 해당 값을 얼마로 해주느냐에 따라

점프 중 동작을 일찍 실행시켜 주거나 할 수 있다.

Fall->Land는 아래와 같이 추가해준다. 점프가 IsInAir값이 True이니 Land는 False값이다.

not bool을 넣어주면 False일 때 동작하게 해줄 수 있다.

Land->Ground는 Land동작이 일정 수준 까지 됐을 때 처리해주면 되고, 아래와 같다.

마지막으로 추가해줬던 입력의 Jump를 MyCharacter.cpp 소스에 추가해주면 끝이다.

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
...
	PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &AMyCharacter::Jump);
...
}

이제 플레이해보면..

 

??????????? 이상하게 버벅 거리는걸 볼 수 있다.

이를 해결하려면, 

위와 같이 애니메이션 루프를 체크해제 해줘야 한다.

 

짜잔~ 이제 캐릭터가 이동부터 점프까지 다 할 수 있게 되었다.

이제 다음 글에서는 공격모션을 추가해보려 한다.

+ Recent posts

/ /

Contact

📧 dlwjdwls60@naver.com


블로그에 내용이 있으면 해당 글을 보여주며, 없으면 내용이 복사된 채로 ChatGPT로 연결됩니다.