카테고리 없음

260123 언리얼엔진 본캠프 114일차 공격 애니메이션 구성

parkjinnam 2026. 1. 23. 21:14

Chooser를 이용한 공격 애니메이션 구성

 

지난 글에서는 PlayerInputState라는 각종 플레이어의 인풋 상태를 변수로 담는 구조체를 생성하고 해당 구조체의 변수를 통해서 Chooser를 구성해서 애니메이션을 구현하는 작업을 진행하였다. 오늘은 Chooser를 이용한 콤보 공격 애니메이션을 구현해보려고 한다. 바로 Chooser를 생성해 주도록 하자

 

Rolling과 같이 애님 몽타주를 따로 재생하는 로직을 작성할 거기 때문에 결과를 AnimMontage로 설정해 주고 PlayerInputState를 파라미터로 지정해 주고 인풋만 받도록 설정해 준다. 해당 Chooser테이블은 캐릭터의 공격을 모두 담아 클래스가 뭐냐에 따라 다른 몽타주를 재생해 줄 것이기 때문에 Nested Chooser를 통해서 상위 분류로 Paladin을 만들어 준다.

T3PlayerInputState에 클래스 정보를 담을 Enum을 선언해두었다

 

이제 애셋으로 받은 애니메이션 중에서 콤보로 적합한 애니메이션을 선정해서 애님몽타주 작업을 해주어야 한다. 모션의 시작과 끝이 잘 이어지도록 후보군을 적절히 설정해준다음 해당 애님 시퀀스의 설정에서 RootMotion과 ForceRootLock을 설정해 준다. 해당 옵션이 꺼져있으면 캡슐이 애니메이션 루트의 위치를 따라가지 못해 애니메이션이 작★살 나게 된다.(알고 싶지 않았다.)

이제 해당 애니메이션 시퀀스로 애님 몽타주를 생성해주고 Chooser에 순서대로 등록해 주자

3콤보로 이루어진 공격모션
Paladin의 공격모션들이 ComboCount 수치에 따라서 선택된다.

 

밑작업은 끝났다. 이제 코드로 넘어가도록 하자 우리는 플레이어 컨트롤러에 인풋 바인딩을 하고 각 함수를 캐릭터나 컴뱃 컴포턴트에서 호출하도록 계층구조를 짜 두었다. 어택에 관련된 인풋 함수는 이미 팀원이 작성해 두었기에 해당 함수에 로직만 추가하는 방향으로 진행해 보겠다. 플레이어 캐릭터에 OnAttack함수를 BlueprintImplementableEvent 속성으로 UFUNCTION 매크로로 등록해 준 다음 PlayerController에서 Attack 인풋이 발생 시 컴뱃의 Attack을 호출하고 해당 함수 안에서 OnAttack 함수를 호출하도록 해준다.

//T3PlayerContoroller.cpp

void AT3PlayerController::Input_Attack(const FInputActionValue& Value)
{
	if (AT3CharacterBase* T3Char= Cast<AT3CharacterBase>(GetPawn()))
	{
		if (UT3CombatComponent* Combat = T3Char->GetCombatComponent())
		{
			Combat->Attack();
		}
	}
}

 

사실 컴뱃을 거치지 않고 바로 Character의 OnAttack을 호출해도 문제없지만 컴뱃 컴포넌트가 없는 캐릭터가 해당 함수를 호출하지 못하도록 방지하기 위해 이러한 다소 거추장스러운 구조를 채택했다. 그리고 공격가능 여부를 판단하기 위해 T3 PlayerInputState에 bIsAttacking과 bCanAttack 변수 2개를 추가해 준다. 이제 호출하는 부분까지 작성해 주었으니 에디터 블루프린트에서 작업을 해주자.

 

로직은 다음과 같다. OnAttack 함수가 호출되면 CanAttack 상태가 true인지 확인을 해준다. true라면 해당 변수를 false로 변경해 주고(중복 공격을 못하게 하기 위해) IsAttacking을 true로 전환해서 공격 중임을 명시해 주고 Chooser를 호출한다. chooser는 PlayerInputState의 CurrentCombo의 값에 따라 애님 몽타주를 선택하고 그 결과를 Play Montage가 받아서 Montage를 재생해 준다. 팀원의 피드백에 따라서 몽타주 재생 속도를 살짝 늦추기 위해서 PlayRate 또한 조절해 주었다. 이제는 CurrentCombo를 관리해 줄 커스텀 함수 AddCombo와 ResetCombo를 작업해 주자

 

AddCombo는 CurrentCombo를 ++ 연산자를 통해 1 증가시킨 다음 CanAttack을 true로 변경해 주고 IsAttacking을 false로 전환한다. ResetCombo는 CurrentCombo를 0으로 바꿔주고 CanAttack을 true IsAttacking을 false로 전환해 준다. 자 이 함수들은 애님 몽타주의 노티파이에서 호출하게 만들어줄 것이다.

블루프린트 생성에서 애님 노티파이를 상속받는 클래스를 생성해 주고 AN_AddCombo, AN_ResetCombo를 만들어주고 내부에 들어가 FUNCTION탭에서 Override를 눌러 New Received Notify를 만들어주고 다음처럼 작성해 준다.

 

자 이제 이 노티파이들을 콤보에 사용되는 몽타주에 적절히 배치해 주면 된다 AddCombo는 애니메이션 동작중에 다음 콤보로 이어지길 원하는 위치에, ResetCombo는 해당 기점을 지나면 다음 콤보로 이어지지 않고 콤보가 초기화되길 원하는 위치에 지정해주면 된다. 그렇기에 마지막 콤보 애니메이션 몽타주에는 Reset만 배치해주면 되겠다.

 

자 이러면 결과를 확인해 보자!

 

콤보가 이어지거나 초기화 되는 모습이 확인된다.

 

오늘은 Chooser를 이용한 콤보 공격 시스템을 구성해 보았다. 다음에는 Chooser에 사용될 인풋을 자세하게 설정해서 방어, LockOn 상태일 때 캐릭터가 로테이션 하지 않고 스트레이프 하면서 움직이도록 구현해볼 생각이다.