[Unreal] FSM 개선, 돌진 공격 구현

Cassis_Soda·2025년 2월 13일

2차 프로젝트

목록 보기
4/10
post-thumbnail

※ 해당 기록은 Unreal 5.5.3 버전을 기준으로 작성되었습니다.


0. 서론

    기존에 만들었던 FSM은 Tick에서 FSM을 처리하다 보니, 공격 모션을 시작했음에도 사거리에서 벗어나면 바로 모션을 취소하고 다시 이동으로 넘어가던 문제가 있었다. 또 돌진 공격에 사용한 모션을 Key를 잡아서 길이를 늘이려 했는데 원하는 대로 수행되지 않아 이를 수정했다.

1. FSM

     기존에IdleMoveAttackIdle로 이어지던 흐름을, IdleMoveAttack_StartAttack_EndIdle로 수정했다. 애니메이션의 끝부분에 노티파이를 추가하고 이를 C++에서 구현했다.

//BossAnimInstance.cpp에서
void UBossAnimInstance::AnimNotify_AttackEnd()
{
	bAttackPlay = false;
	bossfsm->state = EBossState::Attack_End;
}

     이 노티파이 이벤트를 만들 때 문제가 하나 있었다. AnimInstance에서 FSM의 상태를 선언한 class UBossFSM* bossfsm으로 FSM에 접근하려고 했었다.

     기존 오류 코드

//AnimNotify_AttackEnd()에서, 오류
ABoss* Boss = Cast<ABoss>(TryGetPawnOwner());
bossfsm = Boss->fsm;
bossfsm->state = EBossState::Attack_End;

     이 코드를 실행하는 것 자체로는 오류가 나지 않았지만, 상태 전환이 제대로 들어가지 않았다. EBossState:Attack_Start에서 계속해서 갇히는 오류가 발생하는 상황이었다. 그래서 코드를 다음과 같이 수정했다.

     개선 코드

//BossFSM.cpp의 BeginPlay()에서
void UBossFSM::BeginPlay()
{
	/*
    중략
    */

	anim = Cast <UBossAnimInstance>(me->GetMesh()->GetAnimInstance());
	anim->bossfsm = this;
}

     그 전에 FSM에서 AnimInstance를 이미 선언해두고 state를 동기화 하는 용도로 사용하고 있었다. anim->bossfsm = this로 작성하니 원하는 대로 상태 전이가 잘 이루어졌다. 아마 미리 생성하고 시작하는게 꼬이거나 하는 오류가 발생하는걸 막는지 싶다.

2. 돌진 공격

Key추가
    돌진 거리가 너무 짧다고 느껴져서 이런 방법으로, Root의 Key를 잡아서 이동 거리를 늘려보려고 했다. 애니메이션 프리뷰 창에서는 문제가 없었지만, 아니 문제가 있었다. 원래의 애니메이션의 root의 이동거리인 검정선이 늘어나진 않는거였다. 프리뷰 창에서 볼 땐 늘인 만큼 멀리 이동하긴 했지만, 애니메이션 재생이 끝나면 마치 루트모션이 적용되지 않은 것 처럼 마지막 위치로 스냅되는 현상이 있었다.
    그래서 사용한 방법이 LaunchCharacter()였다. 지정한 방향으로 캐릭터를 날려보내는 함수다.

//Boss.cpp에서
void ABoss::Charge()
{
	FVector dir = GetTargetFromMe();
	dir.Normalize();
	this->LaunchCharacter(dir * 12000.f , true, false);
}

     처음에 Normalize()없이 단순히 Boss와 Player의 위치 차이인 dir에 값만 곱해줘서 했었다. 이 때 발생한 문제가, 거리가 멀어지면 Player를 많이 지나쳐가고 거리가 가까우면 조금만 지나친다는 것이였다. Hades의 돌진 공격은 그 거리가 일정하기 떄문에 Normalize()를 사용해 일정한 거리만큼 이동하도록 만들었다.
돌진
    잘 적용되는 걸 볼 수 있다.

3. 앞으로 할 것

     발표가 금요일이니 하루동안은 탄막 패턴을 만들 생각이다. 그 후로는 충돌 처리를 통해 데미지 함수를 주고 받는 것, 장판 패턴도 구현하고, 앞서 만든 패턴을 바탕으로 Monster도 만들 것이다.

0개의 댓글