무기를 이용한 공격시 충돌 체크
무기 애니메이션 재생시 애니메이션의 특정 영역(무기 및 애니메이션의 일정 부분)에서만 충돌 체크를 해야 합니다.
UnrealEngine 에서 제공하는 Paragon 캐릭터 Grux 을 가지고 확인해 보겠습니다.
이미지상 1번째는 실제 타격 전의 이미지이고 2, 3번은 타격 중, 4번이 타격 이후 입니다.
따라서 이미지상 체크해 본다면 2, 3번에서만 히트 체크가 일어나야 합니다.
우리가 알아야 할 것은
1. 모델링에서 타격 체크를 할 부위
2. 애니메이션에서 에서 타격체크를 할 시점
첫번째로 타격 체크할 부위를 알아봅니다.
Grux_Skeleton 뷰를 보게되면 이미 소켓이 많은데 그중에 FX_Trail_L_01, FX_Trail_L_02 이 칼의 가장 윗부분과 가장 아랫부분으로 확인 할 수 있습니다.
이제 이것을 활용한 AnimNotifyState를 만들어 줍니다.
Create Basic Asset -> Blueprint Class
AnimNotifyState 로 생성합니다.
모든 Animation Notify 는 3가지 상태값이 있는데 Begin, End, Tick 이 있습니다.
우리가 필요한 것은 시작과 끝이 아닌 Tick 에서 충돌체크를 할 것이기 때문에 Tick을 Override 해줍니다.
만들어진 AnimNotifyState 로 들어가서 Function 부분에서 Received Notify Tick을 Override를 해줍니다.
MultiSphereTraceByChannel 로 충돌체크를 해 줄 것인데 여기서 소켓 이름이 쓰입니다.
Get Socket Location 으로 소켓 이름으로 Vector 좌표를 받아 MultiSphereTraceByChannel 로 넘겨 줍니다.
Radius 는 원하시는 대로 하시면 되는데 여기서는 적당히 15.0. 얇은 칼이라면 더 얇게 하시면 됩니다.
Draw Debug Type을 For Duration 으로 하셔서 충돌체의 넓이가 적당한가 확인하시면 됩니다.
이제 충돌 된 객체를 For Each Loop로 Character인지 확인하여 데미지를 적용합니다.
Character 라면 Apply Damage 100을 해줍니다.
데미지 수치가 의미있다기 보다는 그냥 충돌이 되는지 확인용 입니다.
AnimNotifyState를 PrimaryAttack_LA_Montage에 적용해 보겠습니다.
공격 판정을 시작할 적당한 시작지점을 찾습니다.
Notifies 채널에 우클릭하여 Add Notify State 아까 만들어 졌던 Notify를 추가해 줍니다.
종료 지점까지 늘려주면 적용됩니다.
Draw Debug 도 잘 그려지고 있습니다.
MultiSphereTraceByChannel 의 Radius 를 줄이면 충돌 판정 영역이 줄어듭니다.
모델링 무기의 크기를 잘 확인 하시고 크기조절하시면 됩니다.
테스트용 더미를 만들어 봅니다.
귀찮으니 Character Blueprint 를 하나 만듭니다.
애니메이션이 이미 다 있기 때문에 Mesh 를 Grux 로 선택합니다.
Event Graph로 넘어가 AnyDamage 이벤트를 추가합니다.
Is Playing 체크는 데미지를 1회 적용을 간단히 하기 위해서이고 사실 다른방법으로 체크해야 합니다.
실제 작업할때는 좀 더 정교한 방법으로 하셔야 합니다.
HitReact 애니메이션을 적용해 줍니다.
Draw Debug 에서도 충돌체크가 잘 일어난것이 확인되었고 실제 테스트용 캐릭터도 애니메이션이 잘 재생됩니다.
AnyDamage 부분에서 Damage를 PrintString 하는 부분이 있는데 이 부분이 1회만 나오면 정상입니다.
보통 애니메이션 충돌이 여러번 일어나기 때문에 1회만 데미지를 주는 방법을 만들어야 합니다.
'Unreal Engine' 카테고리의 다른 글
[UE]MultiSphereTrace 한번만 체크하기 (0) | 2022.04.27 |
---|