해당 카테고리 글들은 Unreal Engine 5 C++: 클라이밍 시스템 구축하기를 수강하고 공부한 내용을 정리한 글입니다.
강의 바로가기
두 번째 섹션 - 클라이밍 움직임 강의 내용 중 중요하다고 생각한 부분만 정리했습니다. 자세한 내용은 강의에서 확인 가능합니다.
먼저, 두 번째 섹션에 대해 정리한 글은 아래와 같습니다.
두 번째 섹션에서는 위로 오르기, 아래로 내려가기, 왼쪽으로 오르기, 오른쪽으로 오르기, ledge를 오르내리기, 클라이밍 상태로 들어가고 나오는 방법을 다룹니다. C++에서 캐릭터 애니메이션 인스턴스 클래스를 만들고 기존 애니메이션 블루프린트를 다시 구축하는 것으로 시작합니다. 그런 다음 Mixamo 애니메이션 파이프라인을 살펴보고 Mixamo 변환기를 사용하여 애니메이션을 리타겟팅하는 방법을 알아봅니다. 이후 클라이밍 운동을 처리하고, 바닥이나 ledge에 도달했는지 확인하는 알고리즘을 작성합니다.
23. 캐릭터 애니메이션 인스턴스
AnimInstance 상속받아서 UCharacterAnimInstance 생성합니다.
void UCharacterAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
if(!ClimbingSystemCharacter || !CustomMovementComponent) return;
GetGroundSpeed();
GetAirSpeed();
GetShouldMove();
GetIsFalling();
}
24. 애니메이션 BP 재구성

이는 GroundLocomotion에서 핀을 이으는 것과 동일. 하지만 이렇게 하면 더 깔끔한 그래프를 얻을 수 있습니다.

이동, 점프 애니메이션 구현
25. Mixamo 애니메이션
https://dev0404.tistory.com/73 블로그에 따로 정리했습니다.
26. 대기 상태에서 클라이밍 몽타주
void UCustomMovementComponent::BeginPlay()
{
Super::BeginPlay();
OwningPlayerAnimInstance = CharacterOwner->GetMesh()->GetAnimInstance();
if(OwningPlayerAnimInstance)
{
OwningPlayerAnimInstance->OnMontageEnded.AddDynamic(this,&UCustomMovementComponent::OnClimbMontageEnded);
OwningPlayerAnimInstance->OnMontageBlendingOut.AddDynamic(this,&UCustomMovementComponent::OnClimbMontageEnded);
}
}

이제 F 클릭시 몽타주가 나옵니다
27. 대기와 클라이밍 간의 전환


애니메이션의 위치가 캡슐과 일치하지 않습니다. 이를 해결하기 위해

애니메이션에서 root 키를 클릭 후 아래로 이동시키고 + 키를 누르면

애니메이션과 캡슐이 잘맞게 됩니다.

28. 클라이밍 로코모션

좌우, 위아래로 움직이는 애니메이션 캡슐 맞게 조정하고 블랜드 스페이스 생성합니다
29. 바닥에 도달했는지 확인
bool UCustomMovementComponent::CheckHasReachedFloor()
{
const FVector DownVector = -UpdatedComponent->GetUpVector();
const FVector StartOffset = DownVector * 50.f;
const FVector Start = UpdatedComponent->GetComponentLocation() + StartOffset;
const FVector End = Start + DownVector;
TArray<FHitResult> PossibleFloorHits = DoCapsuleTraceMultiByObject(Start,End,true);
if(PossibleFloorHits.IsEmpty()) return false;
for(const FHitResult& PossibleFloorHit:PossibleFloorHits)
{
const bool bFloorReached =
FVector::Parallel(-PossibleFloorHit.ImpactNormal,FVector::UpVector) &&
GetUnrotatedClimbVelocity().Z < -10.f;
if(bFloorReached)
{
return true;
}
}
return false;
}
바닥 부분을 체크하기 위해 아래와 같이 코드를 짭니다
const bool bFloorReached =
FVector::Parallel(-PossibleFloorHit.ImpactNormal,FVector::UpVector) &&
GetUnrotatedClimbVelocity().Z < -10.f;
'강의 > UE Climbing System' 카테고리의 다른 글
| [UE Climbing] 2-2. Climbing Animation (5) | 2025.04.14 |
|---|---|
| [UE Climbing] 1. Climbing Movement (0) | 2025.03.28 |