BossFight - 무기 장착 완성

김대겸·2025년 4월 9일

무기 장착 완성

저번에 미쳐 구현 하지 못했던 기능들을 구현 해보자.

< Ability에 필요한 기능 >

4. 부착된 무기에 따라 InputMappingContext 변경 ✔

5. 부착된 무기에 따라 애니메이션 변경 ✔

남은 기능은 InputMappingContext와 애니메이션을 변경을 위해 GA_WeaponSelect_Base를 수정 해주자.

위와 같이 함수를 작성하여 시퀀스 노드에 추가 해주었다.

다음으로 무기 장착 여부를 BFPlayerAnimInstance에 알려줘야 한다 이를 GameplayTag를 통해 알려 주도록 하자.

🎮 UBFPlayerAnimInstance.h

UCLASS()
class BOSSFIGHT_API UBFPlayerAnimInstance : public UBFCharacterAnimInstance
{
	// 중략
	UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = "Anim Data | Refrence")
	bool bIsEquipWeapon;
};

🎮 UBFPlayerAnimInstance.cpp

void UBFPlayerAnimInstance::NativeThreadSafeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeThreadSafeUpdateAnimation(DeltaSeconds);

	if (OwningPlayerCharacter)
	{
		bIsEquipWeapon = UBFFunctionLibrary::NativeDoseActorHaveTag(OwningPlayerCharacter, BFGameplayTag::Player_WeaponEquip);
	}
}

위와같이 bIsEquipWeapon변수를 추가하여 Tag를 검사해 무기를 장착 중인지 확인 할 수 있게 하였다.

다음으로 실제 무기를 장착할때, 해당 Tag가 붙도록 해야한다. EquipmentComponent에서 Tag를 부착 해주자.

🎮 UPlayerEquipmentComponent.cpp

void UPlayerEquipmentComponent::RegisterWeapon(AWeaponBase* NewWeapon)
{
	Super::RegisterWeapon(NewWeapon);

	UBFFunctionLibrary::AddGameplayTagToActorIfNone(GetOwner(), BFGameplayTag::Player_WeaponEquip);
}

기존의 PawnEquipmentComponent의 RegisterWeapon을 가상 함수로 변경하고 PlayerEquipmentComponent에서 override하는 것으로 구현 하였다.

작동 영상

다음으로 다른 무기들을 구현해보자.

쌍검 구현

두번째로 구현할 무기는 쌍검이다. 기존처럼 PlayerWeapon을 상속받아 Blueprint를 생성하자.

해당 무기는 특정 상황에서 칼날이 변경되도록 구현 해보자.

기존의 PlayerWeapon에 StaticMesh를 추가하고 이름을 ActivateBlade로 지정 해주었다.

다음으로 칼날이 변경되는 기능과 Collision Box 크기도 증가 시키도록 구현 해보자

지금은 Test변수로 제어 하나 후에 Attribute와 연동하여 변경 할 예정이다.

마지막 무기인 방패&한손검을 추가하였고 테스트 해보았다.

버그 픽스

RegisterWeapon()함수에서 무기를 삭제해주는 부분이 매번 무기를 스폰하고 등록할때마다 작동되어, 쌍수무기일 경우 한쪽만 부착되는 버그를 발견 하였다.

해당 함수를 수정하고 Ability의 노드를 개선 해보자

🎮 UPawnEquipmentComponent.cpp

void UPawnEquipmentComponent::RegisterWeapon(TArray<AWeaponBase*> NewWeapon)
{
	if (!CurrentWeaponMap.IsEmpty())
	{
		for (TPair Pair : CurrentWeaponMap)
		{
			Pair.Value->Destroy();
		}
		CurrentWeaponMap.Empty();
	}
	for (AWeaponBase* Weapon : NewWeapon)
	{
		CurrentWeaponMap.Add(Weapon->GetWeaponType(), Weapon);
	}
}

🎮 GA_WeaponSeleted_Base

매개변수를 AWeaponBase의 배열로 받게하였고, Ability에서 무기 Spawn과 등록 및 부착을 분리 하였다.

이제부터 무기를 스폰하고 로컬 변수(배열)에 저장, 이후 등록절차를 진행하고, 등록시 EquipmentComponent의 TMap에 있는 Value에 해당하는 객체를Destroy 및 TMap을 비워 주고, 현재 무기들을 추가, 이후 부착으로 진행 되도록 구현 하였다.

작동 영상

다음에는 무기별 공격을 구현해볼 차례이다.

0개의 댓글