Unreal Engine
Unreal Engine - 캐릭터 만들기
gbleem
2025. 1. 24. 20:57
플랫포머 게임을 테스트 하기 위해서 간단한 캐릭터를 하나 만들어 보면서, 관련 내용을 정리해 볼 예정이다.
1. character 클래스 생성 및 기초 세팅
- 우리는 걸어다니는 보행형 캐릭터를 만들기가 목적이기 때문에, Character 클래스를 하나 만들어준다.
- 이후 먼저 할 세팅은 카메라와 spring arm 세팅이다.
- 먼저 SpringArm과 Camera 컴포넌트를 만들어 주어야 한다.
- 이 둘은 "컴포넌트" 이기 때문에 생성자에서 CreateDefaultSubobject를 통해서 생성해주어야 한다.
- 추가적으로 spring arm의 길이와 회전 관련 설정을 해주면 된다.
- 다음으로 사용할 mesh를 지정해 주면 된다.
- mesh는 ConstructorHelper를 이용해서 해당 mesh의 경로를 복사해서 쓰면된다.
- 추가적으로 mesh가 정면을 바라볼 수 있도록 회전과 위치를 조절해 주었다.
- 먼저 SpringArm과 Camera 컴포넌트를 만들어 주어야 한다.
//PlayerCharacter.cpp 생성자
APlayerCharacter::APlayerCharacter()
{
PrimaryActorTick.bCanEverTick = false;
SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
SpringArmComp->SetupAttachment(RootComponent);
SpringArmComp->TargetArmLength = 300.f;
SpringArmComp->bUsePawnControlRotation = true;
CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));
CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
CameraComp->bUsePawnControlRotation = false;
static ConstructorHelpers::FObjectFinder<USkeletalMesh> SkeletaMeshAsset(TEXT("/Game/WarriorHero/Mesh/SK_Warrior.SK_Warrior"));
if (SkeletaMeshAsset.Succeeded())
{
GetMesh()->SetSkeletalMesh(SkeletaMeshAsset.Object);
}
GetMesh()->SetRelativeLocation(FVector(0.f, 0.f, -88.f));
GetMesh()->SetRelativeRotation(FRotator(0.f, -90.f, 0.f));
}
- 게임 시작시 아래와 같이 보이는 것을 확인할 수 있다.
2. character 움직이기
- C++ 로직 작성
- PlayerController 에서는 IMC를 등록하는 로직을 작성하며,
- Character 에서는 PlayerController와 Action을 바인딩 해주는 로직을 작성하면 된다.
- 위의 정리한 글과 깃허브를 코드 참고
- 추가적으로 GameMode를 따로 하나 만들어서
- DefaultPawn을 우리가 만든 캐릭터로
- PlayerController또한 우리가 만든 PlayerController로 만들어 주었다.
//GameMode.cpp
#include "PlatformGameMode.h"
#include "PlayerCharacter.h"
#include "CharacterPlayerController.h"
APlatformGameMode::APlatformGameMode()
{
DefaultPawnClass = APlayerCharacter::StaticClass();
PlayerControllerClass = ACharacterPlayerController::StaticClass();
}
- 주의
- 아직 IMC와 IA를 C++로 적용하지 않아서(IMC와 IA는 PlayerController BP에서 적용함), 게임 실행 시 움직이지 않는 문제점이 있었다.
- IMC랑 IA를 C++로 세팅하는 법을 알아내서, 조만간 적용할 생각이다.
- 해결하기 위해서는 프로젝트 세팅에서 게임모드를 BP로 바꾸고, 게임모드에서도 PlayerController를 BP로 바꿔주면 움직이게 된다.
- 아직 IMC와 IA를 C++로 적용하지 않아서(IMC와 IA는 PlayerController BP에서 적용함), 게임 실행 시 움직이지 않는 문제점이 있었다.
3. character 애니메이션
1. 애니메이션 블루프린트 만들기
- 여기서는 이름을 ABP_PlayerCharacter로 하였다.
- 만들 때 우리가 사용할 스켈레탈 메시에 맞는 스켈레톤을 지정해주면 된다.
2. 애니메이션 블루프린트의 이벤트 그래프 세팅
- Character와 character movement를 변수로 만들기
- 이때는 Blueprint Initialize Animation 이벤트을 사용하였다.
- 속도나 지면에서의 속도, 떨어지고 있는지 등의 변수들도 만들어주면 된다.
- 이때는 Blueprint Update Animation 이벤트를 사용하였다.
- 이때 Character의 유효성 체크를 한 후에 다른 변수들을 만들어 주는 것 이 좋다.
- 아래와 같이 이전에 만든 player character reference를 get해서 가져온 후 검증된 get으로 변환하면, 편리하게 사용할 수 있다.
- 땅에서 움직이는 속도인 ground speed, 움직이는 상태인지 체크하는 should move, 떨어지는 상태인지 체크하는 is falling을 만들면, 기본적인 세팅이 완료된다.
- 전체적인 노드의 구조는 아래와 같다.
3. 애님 그래프 세팅
이벤트 그래프에 만든 값들을 통해 실제 애니메이션이 동작하도록 만들어주면 된다.
- State Machine 이란
- 언리얼 엔진에서 캐릭터의 상태에 따라 어떤 애니메이션을 재생하고, 어떻게 전환할지를 결정하기 위한 논리적 구조
- State Machine 안에는 크게 아래 두가지로 구성이 된다.
- State : 현재 어떤 동작을 하고 있는지
- Transition : 한 상태에서 다른 상태로 언제 전환되는지
세팅 모습
- State Machine
- State Machine 내부
- Idle의 경우 Loop 애니메이션을 적용하여 output pose에 연결하면 된다.
- Walk/Run은 1d Blend space를 사용하면 된다. 이때 위에서 만든 값인 ground speed를 사용한다.
- 추가적으로 blend space와 실제 캐릭터의 speed를 맞춰서 애니메이션을 동작시키기 위해서
- BS의 x축 값을 0, 400, 600으로 설정하고
- C++에서 캐릭터의 일반 speed를 400, sprint speed를 600으로 설정하였다.
- 추가적으로 blend space와 실제 캐릭터의 speed를 맞춰서 애니메이션을 동작시키기 위해서
- transition 조건은
- Idle에서 Walk/Run을 갈때는 Should Move true일 때
- 반대는 Should Move가 false일때로 적용하면 된다.
4. 애님 그래프 세부 설정
- 애님그래프에서 점프, 낙하, 착지 등 다양한 상태를 위해 State Machine을 좀 더 세분화 하여서 구성하였다.
- 먼저 이전에 만든 locomotion을 캐시포즈로 저장하고, main state라는 새로운 state machine을 추가하였다.
- 이때 control rig를 사용해야 하는데, 새로운 에셋을 사용하여 해당 부분을 적용하지 못했다. 이후 추가할 예정이다.
- Main State 구조
- 아래와 같은 모습으로 구현하였고, 주의할 점은 To Falling과 To Land를 스테이트 에일리어스로 구성한 점이다.
- 스테이트 에일리어스 관련해서 이전에 정리한 글
- 자세한 설명
- Locomotion state
- 이전에 저장한 locomotion 캐시 포즈를 그대로 쓰면 된다.
- Land
- apply additve 노드를 통해서 구현하였다 (apply additive 관련 이슈)
- 트랜지션 조건은 should move가 true일 때와 자동 규칙 두가지를 사용하였다.
- 아래 사진이 트랜지션 조건의 자동 규칙 설정 모습
- To Land
- 스테이트 에일리어스로 만들었다.
- 트랜지션 조건은 is falling이 false일때로 설정하였다.
- Fall Loop와 Jump를 스테이트 에일리어스 체크를 해주었다.
- Fall Loop
- Fall 애니메이션을 넣고, Loop를 체크해 주었다.
- Jump
- Jump 애니메이션을 넣고, Loop는 체크하지 않았다.
- 트랜지션 조건은 자동 규칙을 선택하였다.
- To Falling
- 스테이트 에일리어스로 만들었다.
- To Falling에서 Fall Loop로의 조건은 Is Falling이 true일 때
- To Falling에서 Jump로의 조건은 Is Falling이 true이고 Z 속도가100 보다 클 때로 설정하였다.
- 스테이트 에일리어스 체크는 Land와 Locomotion으로 해주었다.
- Locomotion state
- 모두 구현한 모습
- 아직은 애니메이션이 어색한 부분이 많다.
- 점차 업그레이드를 해나가야 할 것 같다.