캐릭터의 이동 애니메이션을 적용해보고 IK Bones를 활용하여 경사진 곳에서 캐릭터의 두 발이 경사면 바닥에 자연스럽게 닿도록 구현해 볼 것이다.
AnimInstance 타입의 C++ 파일을 생성하고 GroundSpeed와 IsFalling 변수를 선언한다.
Kismet헤더파일을 include하고 VSizeXY함수로 Movement컴포넌트를 가져와서 속도를 구해 GroundSpeed로 넣어준다.
bool타입의 IsFalling은 언리얼에서 기본으로 제공하는 IsFalling함수로 넣어준다.
ABP 스테이트 머신은 예전에 사용했던 것과 거의 유사하다.
IsFalling에 따라 애니메이션을 다르게 넣어주면된다.
다음으로 전에 만들었던 2D와 다르게 3D에서 유용한 기능이다.
경사면에서 캐릭터의 두 발중 한 발이 공중에 붕 뜨는데 이를 해결해볼 것이다.
두 발로부터 스피어 트레이스를 사용해서 각각 땅까지의 거리를 측정한다.
땅까지의 거리가 더 큰 값을 구해 그 값만큼 캐릭터의 스켈레톤들을 조정해주는 과정이다.
언리얼에서 제공하는 Control Rig블프를 만든다.
이를 사용하기위한 IK Bone이라는 가상의 뼈가 존재한다.
구한 캐릭터는 IK Bone이 포함되어있었고 없다면 뼈를 우클릭하여 virtual Bone을 추가하여 그것을 사용하면 된다.
Control Rig 블프에서 위와 같이 함수를 만든다.
뼈의 한 부분을 가져와서 스피어 트레이스를 사용하여 땅까지의 거리를 측정한다.
항상 이것을 사용하지는 않으므로 Bool 변수를 하나 만들어 넣어준다.
양 발에 위의 함수를 적용하여 변수로 저장한다.
두 발이 갑작스럽게 순간이동할 것이 아니므로 Interp로 자연스럽게 위치가 이동하도록 한다.
두 발중 낮은 Z값을 Pelvis(골반)값에 넣어준다.
Modify Transforms함수로 두 발과 골반의 위치를 조정한다.
이후 언리얼에서 제공하는 FullBodyIK 함수로 실제로 뼈의 위치를 바꾸도록한다.
ABP에서 위와 같이 IsFalling이 아니고 Ground Speed가 0일때 적용하도록 한다.
떨어지는 중이거나 달릴때는 적용되지 않는다.
달리고 점프하는 애니메이션이 잘 적용되고 경사면 및 단차가있는 구간에서 두 발이 자연스럽게 땅에 닿도록 잘 적용되는 것을 볼 수 있다.
'언리얼 - C++ 프로젝트' 카테고리의 다른 글
OpenWorldRpg (5) 애니메이션 리타깃 및 무기 장착 (0) | 2025.04.24 |
---|---|
OpenWorldRpg (4) C++로 오버랩 이벤트 구현하기 (0) | 2025.04.23 |
OpenWorldRpg (2) 캐릭터 생성 및 이동구현 (0) | 2025.04.21 |
OpenWorldRpg (1) 랜드스케이프 및 폴리지 (0) | 2025.02.18 |
Shooter - (5) 적 AI 구현 (0) | 2024.10.11 |