캐릭터 피격 시 Motion을 재생하게 해 보자
캐릭터가 몬스터로부터의 공격에 피격당했을 시 HP를 계산하면서 동시에 적용되어야 하는 것이 시각적인 피드백이다 흔히 화면이 흔들린다던가, HP바가 줄어드는 것으로 인지할 수 있지만 가장 직관적인 피드백은 바로 캐릭터의 피격 모션이 재생되는 것이라고 할 수 있겠다. 최종프로젝트의 기획단계에서 이러한 피격 모션을 크게 3가지로 분류했었다. 움찔, 경직, 넉백으로 이루어진 피격 모션을 적절한 상황에서 재생해서 게임적 경험을 크게 향상해 보려고 한다.
각각의 피격 모션의 조건이 다르다
앞서 우리는 움찔, 경직, 넉백의 3가지 유형의 피격 모션을 구분해 두었다고 했다. 여기서 Flinch(움찔)은 캐릭터의 모션을 캔슬하지 않고 재생되어야 한다. 예컨대 캐릭터가 공격 중에 움찔 에 해당하는 공격을 맞게 된다면 캐릭터의 모션은 공격이 그대로 되지만 고개만 뒤로 젖혀지는 블랜딩이 있어야 한다. 그 외에 경직과 넉백은 진행 중이던 애니메이션을 캔슬하고 해당 애니메이션을 재생해야 하지만 또 구르기 중에는 경직에 해당하는 공격에는 캔슬되지 않아야 한다. 이런 조건을 고려해서 블루프린트로 피격 모션을 만들어 보자. 왜 블루프린트인가 하면 애님 몽타주를 다루는 작업이기에 바로바로 시각적으로 변화하는 모습을 에디터 상에서 관찰하면서 작업하는 게 용이하다고 판단했기 때문이다.
필요한 변수 작업과 움찔, 경직 작업
일단 피격이 발생하면 무엇이 필요할까? 일단 팀원들이 작성한 피격, 공격 로직에는 공격을 받은 방향과 대미지 타입을 전달하도록 로직이 구성되어 있고 그 변수들을 가져와서 우리가 처리해야 할 것이다. 그렇기에 Combat Component에 들어있는 변수들을 가져와서 블루프린트 내에서 변수로 승격시켜 주는 작업을 먼저 하자. 일단 OnHit이라는 함수를 캐릭터에서 만들어 TakeDamage 마지막에 해당 함수가 호출되도록 하고 BlueprintImplementableEvent 속성을 부여해서 내부 로직은 블루프린트로 구현하도록 하자. 또한 bool 변수로 bIsKnockBack을 추가하여 현재 상황이 KnockBack인지를 판단하여 경우를 나누어서 작업을 해주어야 할 것이다. 그리고 공격 가능 여부도 체크해 주는 로직 또한 같이 작성해 준다.

자 이제 넉백이 아닌 상황부터 생각을 해보자. bIsKnockBack이 아니라면 bIsRolling 변수를 체크해서 구르고 있는 상황인지를 체크해 준다 해당 변수가 true라면 별도의 애님 몽타주 재생 없이 대미지 처리만 진행되면 될 것이다. 만약 false라면 Chooser를 통해서 전달받은 피격 방향에 따른 모션을 재생해 주게 작성해 주고 CanAttack을 true로 바꾸어준다.



이러면 일단 움찔, 경직의 경우는 해결이 되었다. 앞서 움짤의 경우에만 CanAttack을 true로 되게끔 세팅을 해 두었기 때문에 움짤에만 공격을 지속적이게 가능하고 아니면 중간에 모션이 끊기게 될 것이다. 하지만 해당 몽타주들의 속성을 건드려 줘야 작업이 끝난다. 지금 몽타주들의 slot은 기본적으로 default 슬릇으로 되어있어 캐릭터의 온몸이 해당 몽타주를 재생하는 상황이다. 피격 모션에 해당하는 몽타주들에 들어가서 slot을 HitSlot으로 변경해 주고 ABP설정에 들어가서 다음 처럼 설정해 준다.


이제 움찔 에 해당하는 공격이 들어오면 Spine_03에 해당하는 상체만 애니메이션이 재생되어 기존의 모션과 블랜딩 되게 된다.
넉백의 경우
넉백의 경우에는 앞서 넉백 여부를 체크한 다음 true일 경우 넉백 로직으로 전환되게 된다. 우리가 생각해야 하는 점으로는 넉백 중에는 플레이어의 입력이 무시되어야 한다는 것이다. 그렇기에 bMoveLock 변수를 만들어서 Character의 Move함수가 호출될 시 해당 변수가 true이면 바로 리턴하도록 하여 플레이어의 입력을 차단하는 작업을 먼저 해준다.
void AT3CharacterBase::Move(const FVector2D& Value)
{
if (bMoveLock) return;
//코드들
}
자 플레이어의 입력도 차단했으니 바로 넉백 몽타주를 재생해 준다. 우리가 가지고 있는 애셋에는 넘어지기 시작, 날아가는 Loop애니메이션, 땅에 철퍼덕 넘어지는 애니메이션 3개의 애님 시퀀스가 분리되어 있는 상황이다. 이 세 가지의 애님 시퀀스를 하나의 몽타주에 담아두고 섹션을 나누어서 각각 Start, Loop, End 섹션으로 분류해 주었다.

위의 이미지를 보면 Loop에서 End로 넘어가지 않게끔 되어있다. 이는 캐릭터가 날아가다가 땅에 착지하는 그 순간까지 Loop애니메이션을 재생하게 하기 위함이다. 이제 애님 몽타주를 재생해 주었으니 LaunchCharacter을 통해서 캐릭터가 뒤로 날아가게끔 해주면 Loop까지의 작업은 끝나게 된다. 이제 Event OnLanded를 꺼내서 넉백이 맞는지 확인해 주고(단순한 점프인지 착지인지를 확인하기 위해) 사진처럼 작업해 주어 End섹션으로 넘어가게 하면 넘어지기까지의 로직은 완성된다.

이제 캐릭터가 넘어지는 것까지 완성되었으니 캐릭터가 기상하는 로직을 작업해보려고 한다.
'unreal 5기' 카테고리의 다른 글
| 260127 언리얼엔진 본캠프 116일차 디테일한 Chooser을 위한 변수 작업 (0) | 2026.01.27 |
|---|---|
| 260122 언리얼엔진 본캠프 113일차 GASP(7) (0) | 2026.01.22 |
| 260120 언리얼엔진 본캠프 111일차 GASP(6) ChooserTable-2 (0) | 2026.01.20 |
| 260116 언리얼엔진 본캠프 109일차 GASP(5) ChooserTable-1 (1) | 2026.01.16 |
| 260115 언리얼엔진 본캠프 109일차 GASP(4) MotionMatching (1) | 2026.01.15 |