Unreal 슬라이딩 구현 C++ (With Blender + Mixamo Character)

CJB_ny·2023년 2월 1일
0

UE4구현

목록 보기
2/2
post-thumbnail

코드

구현 개요?

일단 달리는 상태에서 Q를 누르면 CapsuleHalfHeight를 절반으로 줄이고 지정한 위치까지 캐릭터를 옮길 것이다.

옮기는 동안은 일단은 아무런 키 입력을 받지 못하게 할 것임.



Q로 Action mapping함.

그리고 슬라이딩을 할 수 있는 조건인지 확인을 해준다.

void AABMyCharacter::Sliding()
{
	if (IsRunning && !CharacterMovementComp->IsFalling())
	{
		ABLOG(Warning, TEXT("Can Slide"));
		Progress = 0.f;
		StartingLocation = GetActorLocation();
		EndingLocation = GetActorLocation() + GetActorForwardVector() * 500.f;
		SlidingEvent.ExecuteIfBound(true);
		IsSliding = true;
		CapsuleComp->SetCapsuleHalfHeight(44.f);
		CapsuleComp->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
	}
	else
	{
		ABLOG(Warning, TEXT("Can't Slide"));
	}
}

이런식으로 해줌. EndingLocation이 내가 슬라이딩이 끝났을 떄 위치이다.

그리고 나서 FMath::Lerp함수를 통해서 이동을 시킬 것이다.

파쿠르랑은 다르게 나누기가 아닌 곱하기로 속도를 올릴 것이다.

float AABMyCharacter::SlidingTick(float DeltaTime)
{
	Progress += DeltaTime * SlidingSpeed;
	Progress = FMath::Clamp(Progress, 0.f, 1.f);
	if (Progress >= 1.f)
	{
		if (IsSliding)
			SetSlidingEnd();
	}
	return Progress;
}

위의 코드가 선형보간할 값을 반환하는 함수이다.

주의할점 1❗

if (IsSliding)
{
	SetActorLocation(FMath::Lerp(StartingLocation, EndingLocation, SlidingTick(DeltaTime)));
}

이제 위와 같이 Tick함수에서 해당함수를 실행만 해주면되는데

이상태로 실행을 하면은

다 뚫고 지나가버림.

if (IsSliding)
{
	SetActorLocation(FMath::Lerp(StartingLocation, EndingLocation, SlidingTick(DeltaTime)), true);
}

bSweep를 true로 켜주도록 하자.

그리고 애니매이션을 보면은 Capsule을 뚫고 나가버린다.

스켈레톤 트리가 있다면

이런식으로 no mesh로 하고 import하면 정상적으로 동작한다.

이렇게 켜주더라도 애니매이션이 뚫고 나가서

세가지를 다 켜주면은

Sweep를 true로 켜주어서 뚫고 나가지는 않지만 애니매이션이 이상하다.

이게 Mixamo Character가 SkeletonTree 에 Root Bone이 없고 Hip부터 시작하기 때문인데.

이렇게 Hip으로 시작함.

Blender로 Root Bone을 넣을 수 있지만 나는 그렇게 까지는 하기 싫어서...

구글링하다가 아주 좋은 방법을 발견했다.

Mixamo Character + Root Bone Animation ❗

참고한 영상
위에 영상보면 다 이해됨.

https://www.blender.org/ 일단 Blender다운해준다.

mixamo에서 Sliding animation준비해준다.

그리고 영상처럼 해서 바로 애니매이션이 제대로 나오면 그래도 사용하면 되는데 본인은 애니매이션이 뒤집혀서? 계속 나오는 오류가 발생해서 Blender에서

영상과는 한가지 다르게

Apply Rotation켜주고 Batch눌러 주니까 제대로 애니매이션이 뽑힘.

주의할 점 ❗❗❗

이렇게 fbx파일 드래그 하면은

이렇게 뜨고나서 import하면

이거 무시하고 No눌러야됨 아니면 기존의 스켈레톤 트리 구조 무너짐. 왜그런지는 모르겠는데 이거때문에 개고생함.

NO눌러주면 이렇게 파일이 뜨는데 에러창은 그냥 무시하면됨.

아니면 처음부터 import할때 No Mesh선택 하면 됨.

Blender사용할 때 ❗

애니매이션이 어떤 애니매이션이냐에 따라

슬라이딩이나 Climbing같은 애니매이션일 때 어느방향으로 이동하는 애니매이션이냐에 따라

UseX, UseY, UseZ 를 이리저리 켜보면서 Batch눌러주면은된다.

슬라이딩의 경우 UseZ는 꺼주고 Apply Rotation켜주었고

위의 경우네는 Climbing할 경우라서 UseZ까지 켜줌.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글