언리얼엔진5/FPS 게임 1인 프로젝트

[UE5 FPS 프로젝트] 5. 총 추가 구현 및 Swap

Rocketbabydolls 2024. 6. 17. 15:58

VIGlockWeapon

 

   Weaponbase에서 상속받아 VIGlockWeapon을 만들고 블루프린트도 만들어 부모 클래스를 VIGlockweapon으로 설정해 주었습니다.

    그리고 메쉬를 변경해 주었고, PointLight 와 Muzzle, MuzzleFlash 등을 메쉬에 맞게 조정해주었습니다.

 

 

부모 클래스 지정

 

Muzzle 과 PointLight 를 적당히 조절

 

 

    WeaponBase 에서 선언해놓은 순수 가상함수들을 오버라이드 해 주어서 기능을 구현했습니다.  VIAKWeapon과 다른 점은 재생하는 에셋만 입니다.

 

++) 24.06.19 수정사항

ChildActorComponent 부착 후 override 된 메서드들 호출 시 에디터가 읽어들이지 못해 순수 함수 매크로를 지우고, 빈 선언만 Weaponbase에 놔두었습니다.

 

가상 함수 오버라이드

 

Weapon Swap

 

     그리고 VICharacter 의 구현을 조금 변경하였는데, 월드에서 첫 번째로 AK 무기를 스폰하였던 것 뒤에 부무기 Glock을 소환해 주었습니다.  bEquippedWeapon 불리언을 통해 주무기를 장착했을 때가 true, 부무기가 장착되었을 때 false 로 설정됩니다.

     InputAction에 1번, 2번 숫자 버튼을 추가한 다음, 각 버튼을 누를 때마다 Visibility 를 조절해주어 무기를 변경할 수 있게 해 주었습니다.

 

void AVICharacter::EquipFirst()
{
	if (!bIsReloading)
	{
		D("EquipFirst")
		bEquippedWeapon = true;

		PrimaryWeapon->GetRootComponent()->SetVisibility(true);
		SecondaryWeapon->GetRootComponent()->SetVisibility(false);


	}

}

void AVICharacter::EquipSecond()
{
	if (!bIsReloading)
	{
		D("EquipSecond")
		bEquippedWeapon = false;

		PrimaryWeapon->GetRootComponent()->SetVisibility(false);
		SecondaryWeapon->GetRootComponent()->SetVisibility(true);


	}

}

 

 

    그 후 불리언을 통해 분기를 하여 캐릭터에서의 Fire, Reload 애니메이션이 알맞게 재생되도록 로직을 구성했습니다. 

 

void AVICharacter::Fire()
{
	UE_LOG(LogTemp, Log, TEXT("Fire"));

	if (bIsReloading) return;

	if (bEquippedWeapon)
	{
		PrimaryWeapon->Fire();

		if (PrimaryWeapon->GetAmmoCount() > 0)
		{
			//Play Montage
			FirstPersonMesh->GetAnimInstance()->Montage_Play(AKFireActionMontage, 1.0f);
		}
	}
	else
	{
		SecondaryWeapon->Fire();
		if (SecondaryWeapon->GetAmmoCount() > 0)
		{
			//Play Montage
			FirstPersonMesh->GetAnimInstance()->Montage_Play(GlockFireActionMontage, 1.0f);
		}
	}
}

 

 

 

실행 영상

 

 

 

 

깃허브

 

 

GitHub - chataeg/VI

Contribute to chataeg/VI development by creating an account on GitHub.

github.com