
한동안 언리얼을 안하고 알고리즘 공부만하다가 시작한 프로젝트라 만들다 보니 너무 엉망이였다.
그래서 유데미 강의와 함께 복습과 놓쳤던 부분, 몰랐던 부분을 보완하고 더 깔끔한 코딩을 배우고 있다. 그와 동시에 리팩토링을 시작하였다.
만들어 둔게 많지 않아서 프로젝트를 새로 만들어서 괜찮았던건 옮기고 고칠건 고치고 뺄건 뺐다.
플레이어가 컨트롤할 캐릭터의 Base가 되는 캐릭터 클래스이다.
3개의 직업을 구상중이며 공통되는 부분은 여기서 구현한다.
플레이어의 캐릭터의 움직임 상태, Action상태, 무기 장착 및 해제 등 상태를 관리하는 컴포넌트다. 이건 잘 만든것같아서 그대로 가져왔고, 개선하고 기능을 추가했다.
먼저 EnumClass는 여러곳에 쓰일 수 있으므로 헤더를 따로 분리하였다.
#pragma once UENUM(BlueprintType) enum class EMovementState : uint8 { EMS_Idle UMETA(DisplayName = "Idle"), EMS_Walking UMETA(DisplayName = "Walking"), EMS_Running UMETA(DisplayName = "Running"), EMS_Jumping UMETA(DisplayName = "Jumping"), }; UENUM(BlueprintType) enum class EActionState : uint8 { EAS_Idle UMETA(DisplayName = "Idle"), EAS_Attacking UMETA(DisplayName = "Attacking"), EAS_Casting UMETA(DisplayName = "Casting"), EAS_Hitted UMETA(DisplayName = "Hitted"), EAS_KnockedDown UMETA(DisplayName = "KnockedDown"), }; UENUM(BlueprintType) enum class EArmedState : uint8 { EAS_Unarmed UMETA(DisplayName = "Unarmed"), EAS_Armed UMETA(DisplayName = "Armed"), };Movement상태를 구분할 EMovementState
Action상태를 구분할 EActionState
Armed상태를 구분할 EArmedState
3개를 일단 구현해두었다.
StateComponent에선 이 3개의 상태 변수와 Getter, Setter 를 만들었고
저번처럼 MovementModeChanged에 바인딩할 함수등을 그대로 유지했다.
능력치를 관리할 컴포넌트이다.
HP나 MP, 공격력, 방어력, 이동속도 등을 구현할 때 다양한 기능을 구현하고 싶으면 전부 분리해서 액터 컴포넌트를 따로 만들어 관리할 생각이였지만 그건 나중에 기능이 많아지면 분리한다 생각하고 총괄하는 능력치 컴포넌트를 만들었다.
지금은 이동속도만 있다.
직접 AnimBlueprint를 구현하기 위해 애님인스턴스도 C++로 만들었다.
Ref변수는 PlayerBase, StateComponent, MovementComponent등이 있고
애니메이션에 사용될 변수는
Velocity, GroundSpeed, Yaw, Pitch, MoveDirection, bMoving, IsFalling, EArmedState 변수등이 있다.
EArmedState를 제외한 변수들은 NotiveUpdateAnimation에서 값을 구해 적용시켰다.
IK릭과 IK리타기터를 이용해서 Mixamo의 XBot을 UE5 Quinn으로 리타기팅하여 애니메이션을 만들었다. 또 파라곤 애셋을 리타기팅 하여 Sword 애니메이션을 만들었다.
기존 UE5캐릭터의 ABP를 복제한다음 원하는대로 수정해서 기본 포즈인 ABP_Common으로 만들고, 파라곤 애셋으로 만든 에임오프셋과 블렌드스페이스로 만든 ABP_Sword를 만들어서 이 둘을 링크드 애님 그래프를 생성했고, 캐시 포즈로 저장하였다.
그리고 EArmedState에 따라 포즈를 블렌드하고, UpperBody블렌딩을 하였다.
Armed상태일 땐 ControllerRotationYaw를 상속받게 하였다.
몽타주 재생 시작시 바로 상태가 변하고 Sword 애니메이션이 적용된다.
달리면서도 잘 적용된다.