개요
UE4 학습 목적으로 옛날에 구매하고 잊고있던 '이득우의 언리얼 C++ 게임 개발의 정석' 책을 언리얼 엔진5 학습차원에서
UE5로 학습하면 어떤 부분이 달라지는 지와 공부를 하며 주의할 내용들에 대한 글입니다.
책의 내용이 궁금하다면 다른 분이 정리한 블로그나 자료를 찾아보는 걸 권장합니다.
본문
애니메이션 애셋을 사용할 폰이나 캐릭터의 스켈레톤에 맞게 임포트할 수 있다.
그 후 코드를 통하여 애니메이션을 지정할 수 있다.
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);
}
}
'개발 공부 기록 > UnrealEngine5' 카테고리의 다른 글
이득우의 언리얼 C++ 게임 개발의 정석 UE5로 따라잡기 - 6 (3) | 2024.11.09 |
---|---|
이득우의 언리얼 C++ 게임 개발의 정석 UE5로 따라잡기 - 5 (1) | 2024.11.07 |
이득우의 언리얼 C++ 게임 개발의 정석 UE5로 따라잡기 - 3 (0) | 2024.11.02 |
이득우의 언리얼 C++ 게임 개발의 정석 UE5로 따라잡기 - 2 (6) | 2024.11.01 |
[UE5] 핫 리로드(Hot Reload)와 라이브 코딩(Live Coding) 테스트 및 정리 (1) | 2024.10.30 |