언리얼 - C++ 프로젝트

OpenWorldRpg (11) Hit Reaction

earth-star 2025. 5. 13. 18:24

적을 생성하고 적을 공격할 때 공격 방향에 따라 적이 비틀거리는 작업을 해 볼 것이다.

적의 에셋을 Miximo에서 구했고 앞, 뒤, 왼쪽, 오른쪽에서 공격받을 때 비틀거리는 모션도 구해서 몽타주로 만들었다.

 

참고로 Miximo에서 구하는 스킨들은 Root Bone이 없어서 비틀거리며 움직이고 다시 제자리로 순간이동한다.

 

이를 수저하기 위해서 Root Bone이 필요한데 Blender를 이용하여 만들 수 있었다.

먼저 HitInterface를 만든다.

 

전에 만든 게임에서도 사용했었는데 자식 블프들에게 공통된 함수를 적용시키기 위해서 인터페이스를 만들어서 집어넣었었다.

 

이 과정을 C++로 만들어 볼 것이다.

 

헤더파일에 간단히 GetHit 함수를 만들었다.

다음으로 Enemy 헤더파일에 class에 IHitInterface를 넣어주고 GetHit 함수를 오버라이드한다.

 

HitReact 몽타주도 넣어준다.

플레이어에 몽타주를 넣듯이 똑같이 넣으면 된다.

GetHit함수를 작성하는데 길어져서 DirectionalHitReact 함수로 추출하였다.

 

오버랩되는 HitBox에는 물체가 접촉하는 위치의 정보가 담겨있다.

 

이 정보를 사용하여 적의 전방벡터와 적의 위치에서 맞는 부위까지의 ToHit벡터 2개를 내적하면 사이각을 구할 수 있다.

 

이 각도를 이용하여 적이 어느 방향으로 비틀거릴지 구한면된다.

 

중간의 ImpoactLowered 벡터는 적과 맞는 부위의 Z 값을 같게하여 같은 평면을 맞추기 위함이다.

 

이 과정이 없으면 Z축값이 달라서 사이각이 3차원공간에서 구해져 적절하지 않을 수 있다.

 

아래의 외적을 통해서 사이각이 음수인지 아닌지를 구해서 오른쪽인지 왼쪽인지 구분한다.

위에서 구한 세타값을 이요하여 앞, 뒤, 왼쪽, 오른쪽 애니메이션 중 어느것을 실행할 것인지 분류한다.

 

아래의 AddOnScreenDebugMessage로 세타값을 표시하고 DrawDebugArrow로 적의 전방벡터와 맞는 벡터 2개를 표시한다.

적을 타격시 두 벡터가 화살표로 잘 표시되고 사이각 세타가 왼쪽 위에 잘 표시돤다.

 

빨간화살표가 적이 바라보는 전방벡터이고 노란색이 맞을때의 충격 방향이다.

 

세타값에 따라 적이 맞는 방향으로 비틀거리는 과정이 잘 동작하는 것을 볼 수 있다.