본문 바로가기

개발 공부 기록/UnrealEngine5

이득우의 언리얼 C++ 게임 개발의 정석 UE5로 따라잡기 - 4

개요

UE4 학습 목적으로 옛날에 구매하고 잊고있던 '이득우의 언리얼 C++ 게임 개발의 정석' 책을 언리얼 엔진5 학습차원에서
UE5로 학습하면 어떤 부분이 달라지는 지와 공부를 하며 주의할 내용들에 대한 글입니다.

책의 내용이 궁금하다면 다른 분이 정리한 블로그나 자료를 찾아보는 걸 권장합니다.

 

알라딘 책 구매 링크

 

이득우의 언리얼 C++ 게임 개발의 정석

언리얼 엔진 학습에 목말라하는 게임 개발자에게 단비 같은 언리얼 엔진 프로그래밍 책이다. 에픽게임즈 본사의 개발자 프로그램 언리얼 데브 그랜트를 수상한 저자의 책으로, 언리얼 엔진의

www.aladin.co.kr

 

본문

애니메이션 애셋을 사용할 폰이나 캐릭터의 스켈레톤에 맞게 임포트할 수 있다.

그 후 코드를 통하여 애니메이션을 지정할 수 있다.

Mesh->SetAnimationMode(EAnimationMode::AnimationSingleNode);
UAnimationAsset* AnimAsset = LoadObject<UAnimationAsset>(nullptr, TEXT("/Script/Engine.AnimSequence'/Game/Animations/WarriorRun.WarriorRun'"));
if (AnimAsset != nullptr)
{
	Mesh->PlayAnimation(AnimAsset, true);
}

 

그러나 이런 방식은 직관적이지 않을 뿐더러 규모가 커질 수록 관리하기가 힘들어지기에
“애니메이션 블루프린트”라는 시각적 방식으로 애니메이션 시스템을 제공한다.

추가 → 애니메이션 → 애니메이션 블루프린트를 통해 애니메이션 블루프린트를 생성할 수 있고 원하는 스켈레톤에 맞춰서 제작할 수 있다.

 

생성된 애니메이션 블루프린트의 우측 하단 “애셋 브라우저”창을 통해 해당 스켈레톤이 적용되는 애니메이션 파일들이 보이고
가운데의 AnimGraph에 끌어다 놓아 로직을 구성하면서 애니메이션의 유기적 상태 구조를 제작할 수 있다.
이러한 애니메이션 시스템은 C++ 프로그래밍의 Anim Instance라는 클래스로 관리된다.

 

스켈레탈 메시 컴포넌트의 애니메이션 모드를 애니메이션 블루프린트로 변경하고
생성한 애니메이션 블루프린트의 레퍼런스를 가져와서 애님 인스턴스 클래스로 관리하도록 동작한다.

블루프린트 애셋의 레퍼런스를 가져오는 것이기에 꼭 ‘_C’를 경로 마지막에 붙여주는 것을 잊지말자.

Mesh->SetAnimationMode(EAnimationMode::AnimationBlueprint);
static ConstructorHelpers::FClassFinder<UAnimInstance> WARRIOR_ANIM(TEXT("/Script/Engine.AnimBlueprint'/Game/Animations/WarriorAnimBlueprint.WarriorAnimBlueprint_C'"));
if (WARRIOR_ANIM.Succeeded())
{
	Mesh->SetAnimInstanceClass(WARRIOR_ANIM.Class);
}

 

 

인간형 폰을 제작하기 편하게 제공하는 특수한 모델을 캐릭터라고 함.

새로운 C++ 클래스를 생성할 때 캐릭터 클래스를 선택하고 생성하고 나면
ACharacter라는 클래스를 상속받고 있는 캐릭터 클래스가 생성된다.
이 ACharacter클래스의 선언으로 이동해보면 캡슐, 스켈레탈 메쉬, 캐릭터 무브먼트 컴포넌트를 갖고 있는 채로 생성됨을 확인할 수 있다.

 

또한 private로 되어있는 각 컴포넌트들에 접근할 수 있도록 Get 함수들을 통해 접근할 수 있게 구현되어있다.
ACharacter 클래스를 상속받은 클래스를 사용할 때는 저 Get 함수들을 통해 접근하도록 한다.

 

ACharcter 클래스에 적용되는 CharacterMovement 컴포넌트가 이전에 사용했던
FloatingPawnMovement에 비해 가지는 장점은 다음과 같다.

  • 점프와 같은 중력을 반영한 움직임을 제공한다.
  • 다양한 움직임을 설정할 수 있다. 걷기 외에도 기어가기, 날아가기, 수영하기 등의 다양한 이동 모드를 설정할 수 있고, 현재 움직임에 대한 더 많은 정보를 전달한다.
  • 멀티 플레이 네트워크 환경에서 캐릭터들의 움직임을 자동으로 동기화한다.

 

교재에서 소개하고 있는 Shift + V 키를 사용하여 GTA와 DIABLO식 시점 변경 예시를 따라할 때
향상된 입력을 통해서 제작하면 기존 입력 매핑의 Shift나 Ctrl, Alt 등을 조합하여 입력 처리하는 부분이 존재하지 않는다.
향상된 입력을 통한 키 합성 기능 수행은 트리거를 사용하여 구현 가능하다.

코딩된 액션(Chorded action)을 통해 만들어둔 IA_Shift 액션을 묶고, 트리거로 눌림 처리를 하면 Shift + V 키로 지정한 액션이 수행된다.
눌림 처리를 하지 않으면 Triggered 상태로 되어있었기에 눌려있는 틱마다 계속 호출된다.

직접 테스트 해보면서 찾아낸 결과이기 때문에 더 좋은 방법이 있을 수도 있으니 다방면으로 찾아보는 것이 좋을 것 같다.

void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
	if (UEnhancedInputComponent* EnhancedInputComponent = Cast<UEnhancedInputComponent>(PlayerInputComponent))
	{
		EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AABCharacter::Look);
		EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AABCharacter::Move);
		EnhancedInputComponent->BindAction(ViewChangeAction, ETriggerEvent::Triggered, this, &AABCharacter::ViewChange);
	}
}