게임 개발 (언리얼 엔진)

UE4 생존게임 제작 - 1 (캐릭터 제작)

언린이 2020. 10. 29. 16:38

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 함수를 사용하여 몽타주를 실행시켜주면 됩니다.

 

 

다음에 해야할 일

 

몬스터 메시 선정 및 제작

몬스터 스폰 시스템 제작