BossFight - 무기별 공격 구현(강 공격)

김대겸·2025년 4월 15일

무기별 공격 구현(강 공격)

이번에는 우클릭을 통한 공격을 구현 해보겠다. 우 클릭 입력을 통해 작동 되는 공격은 총 2종류로 구상 하고 있다.

< 강 공격 >

  • 처음부터 우 클릭을 눌렀을때 동작하는 공격 임
  • 일반 공격보다 높은 데미지를 가지고 있음
  • 무기별로 콤보 공격 일수도, 차지 공격 일 수도 있음
  • 강 공격의 모션이 끝날때 까지는 좌 클릭을 통한 일반 공격이 작동 하지 않음

< 파생 공격 >

  • 좌클릭 공격 중 특정 모션에서 우 클릭 시 다른 공격으로 파생되어 연계됨
  • 파생 공격 중 좌 클릭을 통해 다시 일반 공격 콤보로 돌아 올 수 있음

위와 같이 우 클릭을 통한 공격은 2가지 작동 방식을 가지고 있다.

양손 도끼 - 강 공격 구현

양손 도끼의 강 공격은 차지 형태의 공격이다. 차지 단계는 1,2단계로 나눠지고, 키를 땐 시점에 1단계, 2단계 여부에따라 다른 애니메이션이 출력 되도록 구현 하면 된다.

필요한 InputAction 및 Tag를 정의 해보자.

< Gameplay Tag >

InputTag_Hold_ChargeAttack -> InputAction의 Tag
Player_Ability_ChargeAttack_Charging -> 차징 Ability Tag
Player_Ability_ChargeAttack_Attack -> 차지 후 공격 Ability Tag
Player_Status_Charge_1 -> 차지 단계( 1단계 )
Player_Status_Charge_2 -> 차지 단계( 2단계 )
Player_Event_Charge1 -> 차지 단계를 알려주기 위한 GameplayEvent Tag(1 단계)
Player_Event_Charge2 -> 차지 단계를 알려주기 위한 GameplayEvent Tag(1 단계)
Player_Event_ActivateChargeAttack -> 키를 땠을 Ability를 작동 시키기 위한 Tag

위와 같이 Gameplay Tag를 지정 해주었다.

이후 InputAction을 작성하고, MapingContext에 추가 및 InputConfig에도 추가해주었다.

다음으로 Ability를 구현 해보자, 차지형태의 공격은 키를 유지하는 동안은 차징 모션이 나오고, 키를 해제 하면 공격이 나가도록 해야한다. 이를 각각 GA_Player_ChargeMotion_Base와 GA_Player_ChargeAttack_Base로 이름을 정했다.

<GA_Player_ChargeMotion_Base>

우선 입력이 되면 PlayMontageAndWait노드를 통해 Montage를 재생하고, GameplayEvent를 수신받는것을 대기 하도록 한다.

이후 AnimNotify를 통해 해당하는 GameplayEvent가 수신되면, 각 차지 단계에 맞도록 GameplayTag를 플레이어에게 부착 및 이전 단계의 Tag를 제거한다.

이후 키를 해제 하여 EndAbility가 호출 되면 Player_Status_Charge의 하위 Tag가 있는지 확인하여, 있으면 SendGameplayEvent를 통해 GameplayEvnet를 발송한다.

<GA_Player_ChargeAttack_Base>

다음으로 실제 공격에 해당하는 Ability를 구현 하였다.

위와 같이 트리거 탭을 설정하여 해당하는 Player_Event_ActivateChargeAttack로 GameplayEvent가 Actor에게 발송되면 Ability가 작동하도록 구현 하였다.

해당 Ability는 간단하게 작동시 부착되어있던 차지단계 Tag를 지워주고 애니메이션을 호출 하도록 하였다.

작동 영상

위와같이 1차지 2차지의 공격이 다르게 나가도록 구현 하였다.

다음으로 쌍검과 한손검의 강 공격을 구현 해보자. 두 무기의 강 공격은 모두 일반공격과 같이 콤보 공격의 형식이다.

쌍검 - 강 공격 구현

쌍검의 경우 강 공격은 중간에 공중으로 뛰어오르고 마지막에 사선으로 내려오는 애니메이션을 사용 할려고한다.

하지만 현재 GA_Player_Combo_Base Ability에서는 공중으로 뛰어오르는모션은나와도 실제로 공중으로 뛰어 오르진 않는데 이를 MovementMode를 변경하는 노드를 추가하여 구현 해보자.

Montage가 실행 하기전에 공중 공격인지 판단하는 IsAir? 변수를 통해 MovementMode를 Flying 이나 Walking으로 변경하도록 구현 하였다

또한 변경한 모드는 콤보가 종료되는 타이밍에 원래 모드인 Walking으로 돌아오도록 구현 하였다. 또한 강 공격의 마지막 AnimMontage에서 EndCombo Event를 발송하도록 AnimNotify를 추가 하였다.

작동 영상

중간에 콤보를 끊더라도 다시 Walking모드로 MovementMode가 변경되어 정상적으로 걷는 것을 확인 하였다.

검&방패 - 강 공격 구현

검&방패의 강 공격은 방패로 공격하도록 구현 할 예정이고 사용할 애니메이션또한 구하였다.

하지만 잘보면 방패를 든 왼손이 아닌 검을 든 오른손으로 공격 하는 것을 확인할수 있는데 이를 MirrorDataTable를 통해 좌우 반전을 시켜 사용 해보겠다.

우선 해당 스켈레톤을 통해 MirrorDataTable를 추가해주자.

이후 레벨 시퀀스를 생성하여 레벨에 배치하고, 사용하는 캐릭터의 스켈레톤과 애니메이션을 순서대로 추가하고, 애니메이션의 프로퍼티에 생성한 MirrorDataTable를 할당하여, 시퀀스를 새롭게 생성 하였다.

성공적으로 좌우 반전이 되었다.

이후 기존처럼 Combo공격으로 구현 하였다.

작동 영상

다음에는 파생 공격을 구현 해볼 예정이다.

버그 수정

무기를 장착한 상태로 다른 무기를 장착 할 때 InputMapingContext가 제대로 작동 하지 않는 문제를 확인하였다.

디버깅 해본 결과, 무기가 장착 해제될때 기존의 InputMapingContext나 AnimLayer를 해제해주지 않은 것을 확인 하였다. 따라서 WeaponData에 각 InputMapingContext와 AnimLayer를 추가하고, GA_WeaponSeleted 를 수정 해주었다.

🎮 FBFPlayerWeaponData

USTRUCT(BlueprintType)
struct FBFPlayerWeaponData
{
	GENERATED_BODY()

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, meta = (TitleProperty = "InputTag"))
	TArray<FBFAbilitySet>WeaponAbilities;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	UInputMappingContext* InputContext;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TSubclassOf<UBFAnimLinkedLayer> WeaponAnimLayerClass;
};

0개의 댓글