BossFight - Player 회피 구현

김대겸·2025년 5월 9일

Player 회피 구현

이번에는 플레이어의 회피를 구현 해볼예정이다, 필요한 정보를 정리해보자

🐱‍🏍 < 플레이어 회피 >

  • 스페이스바를 눌러 Ability 작동, Cost로 SP를 소모 함
  • Ability가 작동되고, Animnotify 를 통해 Gameplay Event를 발송 회피Tag를 부착 및 제거
  • Ability가 작동되는 도중에는 SP(스태미나)회복 불가

위의 정리 내용을 토대로 구현 해보자

우선 필요한 Tag를 정의해보자.

🐱‍🏍 < Tag 정리 >

  • InputTag_Avoid -> 회피 입력 Tag
  • Player_Ability_Avoid -> 회피 Ability Tag
  • Player_Status_UseAvoid -> 회피 Ability 사용중을 알리는 Tag(SP 충전 방지)
  • Player_Status_Avoiding -> 실제 회피 판정 Tag(데미지 받지 않음)
  • Player_Event_AvoidingStart -> Tag 부착용 Evnet Tag
  • Player_Event_AvoidingEnd -> Tag 제거용 Evnet Tag

위와 같이 Tag를 구성 하였다. 이제 실제로 InputAction과, GameplayAbility를 작성하고, 추가하여 보자.

Ability는 아래와 같이 구성 하였고

추가적인 옵션을 아래와 같이 설정 하였다.

또한 GE_Avoid_Cost를 작성하여 할당 해주었으며, 해당 GameplayEffect는 CurrentSP(현재 스태미나)를 -20 하도록 하였다.

마지막으로 GE_SP_Charge에서 Tag쿼리에 Player_Status_UseAvoid를 추가하여, 회피 Ability가 작동 하는 동안은 SP가 회복 되지 않도록 구현 하였다.

작동 영상

회피 거리 조절

이후 전리품을 통해 회피거리를 조절 할수 있게 할 예정이기에, MotionWarping을 활용하여, 현재 회피시 이동 거리를 조절 해보자.

이를 위해 BFBaseCharacter에 MotionWarpingComponent를 추가하고 생성자에서 할당하였다.

🎮 ABFBaseCharacter.cpp

ABFBaseCharacter::ABFBaseCharacter()
{
	//중략
	MotionWarpingComponent = CreateDefaultSubobject<UMotionWarpingComponent>(TEXT("MotionWarpingComponent"));
}

다음으로 회피 몽타주에서 MotionWarping을 적용 해보자.

아래와 같이 디테일 탭을 수정 하였다. 회전은 사용하지 않음으로 워프 회전을 Off하고, 워프 타깃 이름을 설정 하였다.

다음으로 GaemplayAbility에서 해당 워프 타겟을 업데이트해주면 된다.

위와 같이 함수를 추가하여, 노드를 구성 하였고 Play Montage And Wait() 함수가 호출 하기전에 위의 함수를 호출하여 적용 시키도록 구현 하였다.

이제 피격시 회피에 성공하면 Log를 출력 하도록 코드를 작성 해보자.

void AEnemyWeapon::AttackTrace()
{
	//중략
	if (HitResult.GetActor() && UBFFunctionLibrary::IsTargetPawnHostile(Cast<APawn>(GetOwner()),  Cast<APawn>(HitResult.GetActor())))
	{
		if (UBFFunctionLibrary::NativeDoseActorHaveTag(HitResult.GetActor(), BFGameplayTag::Player_Status_Avoiding))
		{
			Debug::Print("Player Is Avoiding");
		}
		else
		{
			Debug::Print("Player Is Damaged");
			// TODO : 피격한 객체에게 데미지 전달
		}
	}
}

회피시 Trace에 충돌 하면 Player Is Avoiding문자열이 출력 되는것을 확인 하였다.

다음에는 공격 및 피격시 데미지를 주는 기능을 구현 해보겠다.

0개의 댓글