1. 플레이어 메시 선정 및 제작
플레이어 메시를 선정하고 1인칭 카메라를 설치하였습니다.
C++ 프로젝트를 이용해 플레이어 클래스를 만들고 블루프린트를 이용해 스켈레탈 메시를 적용하였습니다.
2. 플레이어의 움직임 조작을 위한 키 입력 매핑 제작
마우스 X, Y축에 따른 화면 회전과 키보드 WSDA로 캐릭터가 이동할 수 있도록 축매핑을 하였습니다.
또한, 액션매핑을 이용해 키보드 1, 2, 3 숫자 버튼을 통해 공격 상태를 변경할 수 있도록 하였습니다.
(1: 일반, 2: 검, 3: 활)
그리고 마우스 왼쪽 버튼을 통한 공격과 스페이스바를 통한 점프 키를 생성하였습니다.
3. 플레이어 애니메이션 제작
플레이어 상태(1: 일반, 2: 검, 3: 활)에 따른 각기 다른 애니메이션을 적용하였습니다.
애님인스턴스를 상속받은 C++ 프로젝트를 생성하고, 이를 상속받는 블루프린트로 애니메이션을 적용하였습니다.
Ground 내부 모습입니다.
Run 모션은 캐릭터의 움직임에 따라 앞, 뒤, 오른쪽, 왼쪽을 다르게 적용하기 위해 스테이트 머신으로 생성하였습니다.
Run 내부 모습입니다.
void APlayerSurvivor::MoveFront(float fScale)
{
// 포워드 벡터를 이용해 앞, 뒤로 이동
AddMovementInput(GetActorForwardVector(), fScale);
if (IsValid(SurvivorAnim))
{
if (fScale > 0.f)
SurvivorAnim->SetMoveDir(EDir::Front); // 플레이어의 움직임에 따라 Dir 변수에 값을 적용하는 함수
else if (fScale < 0.f)
SurvivorAnim->SetMoveDir(EDir::Back);
}
}
void APlayerSurvivor::MoveSide(float fScale)
{
// 라이트 벡터를 이용해 오른쪽, 왼쪽으로 이동
AddMovementInput(GetActorRightVector(), fScale);
if (IsValid(SurvivorAnim))
{
if (fScale > 0.f)
SurvivorAnim->SetMoveDir(EDir::Right);
else if (fScale < 0.f)
SurvivorAnim->SetMoveDir(EDir::Left);
}
}
플레이어의 움직임에 따라 SetMoveDir(플레이어 애니메이션 클래스에 만들어놓은 함수)로 Dir 변수에 상황에 맞는 값을 적용하여 움직이는 방향에 따라 모션이 달라질 수 있도록 하였습니다.
4. 공격 모션 몽타주 제작
애니메이션을 우클릭하여 몽타주를 생성하였습니다.
그리고 나서 애님 슬롯을 추가 한 뒤,
해당 애님 슬롯을 최종 애니메이션 포즈 전에 추가해주면 됩니다.
몽타주는 몽타주를 실행시키라는 입력이 있으면 무조건 실행되고 그렇지 않다면 실행되지 않습니다.
따라서, 사용자가 공격 키를 눌렀을 때, 몽타주를 실행시켜주면 됩니다.
static ConstructorHelpers::FObjectFinder<UAnimMontage> Attack1Asset(TEXT("AnimMontage'/Game/Player/MTGSwordAttack.MTGSwordAttack'"));
if (Attack1Asset.Succeeded())
Attack1Montage = Attack1Asset.Object;
static ConstructorHelpers::FObjectFinder<UAnimMontage> Attack2Asset(TEXT("AnimMontage'/Game/Player/MTGBowAttack.MTGBowAttack'"));
if (Attack2Asset.Succeeded())
Attack2Montage = Attack2Asset.Object;
플레이어 애니메이션 클래스의 생성자에서 몽타주 애셋을 불러온 뒤,
void USurvivorAnim::Attack()
{
// 칼 공격
if (!Montage_IsPlaying(Attack1Montage) && State == (uint8)EState::Sword)
Montage_Play(Attack1Montage);
// 화살 공격
else if (!Montage_IsPlaying(Attack2Montage) && State == (uint8)EState::Bow)
Montage_Play(Attack2Montage);
}
사용자가 공격 키를 눌렀을 때, Montage_Play 함수를 사용하여 몽타주를 실행시켜주면 됩니다.
다음에 해야할 일
몬스터 메시 선정 및 제작
몬스터 스폰 시스템 제작
'게임 개발 (언리얼 엔진)' 카테고리의 다른 글
UE4 생존게임 제작 - 6 (PreyAnimal AI Controller 및 Data Table 제작) (0) | 2020.11.04 |
---|---|
UE4 생존게임 제작 - 5 (PredatorAnimal AI Controller 제작) (0) | 2020.11.03 |
UE4 생존게임 제작 - 4 (랜드스케이프 제작) (0) | 2020.11.01 |
UE4 생존게임 제작 - 3 (충돌 시스템 제작) (0) | 2020.10.31 |
UE4 생존게임 제작 - 2 (몬스터 제작) (0) | 2020.10.30 |