포트폴리오 제작기 9 - IK
TPS 캐릭터가 가상의 조준점을 자연스럽게 바라보도록 Animation Rigging 기반 IK를 구성한 과정을 정리합니다.
Unity Animation Rigging Package
이번 작업에는 Unity의 Animation Rigging 패키지를 사용했다. Animation Rigging은 기존 애니메이션 위에 Constraint 기반의 보정을 추가할 수 있는 패키지다. 캐릭터의 특정 Bone이 Target을 바라보게 하거나, 손과 발이 지정된 위치를 따라가도록 런타임에 자세를 제어할 수 있다. 원본 애니메이션을 동작별로 새로 만들지 않고도 조준점과 무기에 맞춰 자세를 보정할 수 있어 이번 작업에 적합했다.
사용하면서 느낀 장점
- 필요한 부위에만 IK를 적용할 수 있어 불필요한 연산을 줄일 수 있다.
- 작은 단위의 Constraint를 조합하는 방식이라 목적에 맞는 다양한 IK 구조를 만들 수 있다.
- Unity의 Job System을 기반으로 애니메이션을 처리하므로 멀티스레딩을 통한 성능상의 이점을 기대할 수 있다.
아쉬웠던 점
- 필요한 Constraint를 하나씩 조합하고 설정하는 과정이 번거롭다.
- 일반적인 인간형 캐릭터를 위한 Full-Body IK 구성이 기본으로 제공되지 않는다. 시간이 된다면 전신 IK 구성을 자동화하는 스크립트를 만들어보고 싶다.
- Weight를 제외한 설정값은 Editor Mode에서 지정해야 안정적으로 반영됐다. Play Mode에서 값을 변경하면 의도대로 동작하지 않는 경우가 있었다.
TPS 조준을 위한 IK가 필요했다
이번에는 TPS 캐릭터가 가상의 조준점을 자연스럽게 바라보도록 IK를 구성했다. 테스트 장면에서는 임시로 배치한 구체를 조준점으로 사용했으며, 구체가 움직이면 캐릭터의 자세도 그 방향을 따라가도록 만들었다.
기존 애니메이션만으로는 수평 방향의 조준 자세를 표현할 수는 있어도, 조준점의 높이에 맞춰 허리를 숙이거나 상체를 들어 올리는 동작까지 자연스럽게 대응하기 어려웠다. 정해진 애니메이션에 캐릭터의 조준 방향을 맞추는 대신, 실제 TPS에서 사용될 가상의 조준점을 기준으로 상체와 무기의 방향을 실시간으로 보정하는 것이 이번 작업의 목적이었다.
데모에서 확인할 수 있는 것
데모에서는 임시 조준 구체를 움직이며 전체 IK 결과를 확인했다. 조준 구체의 높이가 변할 때 Hierarchy에 구성한 순서대로 허리가 먼저 방향을 잡고 고개가 이어서 움직이는 모습을 볼 수 있다.
총의 위치와 방향이 변하는 동안에도 왼손은 무기 프리팹에 지정한 Target 위치를 유지한다. 이때 팔꿈치는 고정된 위치로 강제되는 것이 아니라, 무기별로 조정한 Hint 방향을 참고해 자연스럽게 굽혀진다.
Animation Rigging의 실행 순서를 계층으로 표현했다
IK는 Unity의 Animation Rigging 패키지를 이용해 구성했다. Rigs 아래에는 상체를 담당하는 body ik를 만들고, 그 아래에 Spine 1, Head, HandAim을 배치했다.
Animation Rigging의 IK는 Hierarchy에 배치된 순서대로 실행된다. 따라서 먼저 척추의 방향을 보정한 뒤, 변경된 자세를 기준으로 머리의 방향을 다시 보정할 수 있도록 Head를 Spine 1 아래에 배치했다.
이 구조는 실행 순서만을 위한 것이 아니다. Hierarchy를 보는 사용자도 머리 보정이 척추 보정 다음에 이어진다는 관계를 명확하게 파악할 수 있다. 내부 동작 순서와 에디터에서 보이는 구조가 일치하도록 구성한 것이다.

오른손을 무기 조준의 기준으로 삼았다
총은 캐릭터의 오른손 Socket에 장착했다. 무기와 손의 연결 방법을 검토했을 때, 오른손에 총을 고정하고 왼손이 총을 따라가게 하는 구성이 장전 애니메이션에서 가장 자연스러웠다. 따라서 HandAim의 Multi-Aim Constraint는 오른손이 aim target을 향하도록 설정했다.
HandAim은 실행 구조상 Head 아래에 둘 수도 있지만 별도의 계층으로 분리했다. Head 아래에 배치하면 Hierarchy를 보는 작업자가 머리 Bone 아래에 손이 연결된 구조로 착각할 수 있기 때문이다. 척추와 머리의 연속적인 보정 관계는 중첩된 계층으로 표현하고, 오른손 조준은 별도의 역할이라는 점이 드러나도록 구성했다.

Play Mode에서 맞춘 무기 위치를 보존했다
무기는 오른손 Socket 아래에 배치하고, 무기 프리팹 내부에는 왼손이 잡을 위치인 Left Hand IK Target, 팔꿈치 방향을 제어할 Left Hand IK Hint, 발사 위치를 나타내는 Fire Point를 구성했다.
무기와 손이 자연스럽게 맞물리는 위치는 캐릭터의 애니메이션이 실제로 재생되는 Play Mode에서 확인하는 편이 정확하다. 하지만 Play Mode에서 조정한 Transform 값은 재생을 종료하면 사라진다. 같은 값을 기억했다가 Editor Mode에서 다시 입력해야 하는 반복 작업을 없애기 위해, 실행 중의 Transform 정보를 저장하고 재생 종료 후 불러오는 기능을 만들었다.

또한 Auto Create IK References 기능을 통해 각 무기에 필요한 Target과 Hint를 자동으로 만들고 참조까지 연결하도록 했다. 새로운 무기를 추가할 때마다 같은 오브젝트 구조와 참조를 수동으로 구성하는 작업을 줄일 수 있다.
반복 작업을 줄이기 위한 두 가지 컴포넌트
Socket Transform Description
에는 무기가 Socket에 장착됐을 때 적용할 Transform 정보가 들어 있다. Play Mode에서 위치를 조정한 뒤 Save for Editor Mode (Persistent)를 누르면 현재 값을 임시 파일에 저장한다. 재생을 종료한 다음 Editor Mode에서 Load from Play Mode (Persistent)를 누르면 저장했던 값을 다시 불러온다. Play Mode를 반복하며 값을 기억하고 다시 입력할 필요가 없어 무기 위치를 훨씬 빠르게 조정할 수 있다.
Weapon IK References
는 무기에 필요한 Right Hand Target·Hint와 Left Hand Target·Hint를 관리한다. Auto Create IK References 버튼은 이 오브젝트들을 자동으로 생성하고 참조를 연결한다. Target과 Hint 역시 Play Mode에서 조정한 값을 임시 파일에 저장한 뒤 Editor Mode에서 불러올 수 있도록 했다. Socket Transform과 같은 방식으로 IK 위치를 빠르게 반복 조정하기 위한 기능이다.
무기 생성 이벤트로 IK Controller를 연결했다
무기 프리팹 내부의 Target과 Hint는 해당 무기에 맞춰 조정한 손과 팔꿈치의 기준 위치를 보관한다. 캐릭터에는 실제 Animation Rigging 제어에 사용하는 별도의 IK Target과 Hint가 존재한다.
무기가 생성되면 이벤트를 발생시켜 캐릭터에 부착된 IK Controller에 새로운 무기가 준비됐다는 사실을 알린다. 이를 통해 캐릭터의 IK 시스템이 현재 무기에 설정된 Target과 Hint 정보를 전달받아 사용할 수 있도록 구성했다.
이벤트를 받은 뒤에는 전용 컴포넌트가 매 프레임 무기 내부 Target과 Hint의 Position과 Rotation을 가져온다. 가져온 Transform 정보를 캐릭터 측 IK 오브젝트에 적용해, 무기와 캐릭터가 움직이는 동안에도 손과 팔꿈치의 기준 위치가 계속 일치하도록 했다.
이처럼 캐릭터 측에 별도의 Target과 Hint를 둔 이유는 Rig Builder의 참조 방식 때문이다. Rig Builder는 처음 설정된 Target과 Bone 정보를 저장해 사용하므로, 무기가 바뀔 때 Constraint의 참조 대상을 다른 오브젝트로 직접 교체하려면 별도의 갱신 코드가 필요하다. 이 방식은 구현이 번거롭고 예상하지 못한 오류를 만들 가능성도 있었다.
대신 캐릭터의 Rig 아래에 Target과 Hint를 미리 만들어 참조 구조를 고정했다. 각 오브젝트에는 Snap To Target 컴포넌트를 붙여 현재 무기의 실제 Target과 Hint를 매 프레임 따라가게 했다. Rig Builder의 참조를 계속 바꾸지 않으면서도 무기마다 다른 IK 위치를 적용할 수 있다.

허리와 고개가 같은 조준점을 순서대로 바라보게 했다
Spine과 Head에는 각각 Multi-Aim Constraint를 적용하고, 같은 aim target을 바라보도록 설정했다. 두 Constraint의 역할에 별도의 차이를 둔 것은 아니다. 먼저 허리가 조준점을 향해 움직이고, 변경된 상체 자세를 기준으로 고개가 이어서 움직이도록 Hierarchy 순서를 맞춘 것이 핵심이다.
모델의 Bone 방향과 화면에서 자연스럽게 보이는 조준 방향에는 차이가 있었다. Spine은 Y축 Offset을 60도로 설정했을 때 가장 자연스러운 자세가 나왔기 때문에 해당 값을 보정값으로 사용했다.


Aim Axis를 쉽게 확인하는 방법
Multi-Aim Constraint를 처음 설정할 때는 어떤 축을 Aim Axis로 사용해야 하는지 헷갈릴 수 있다. 이때 Scene View 왼쪽 상단의 Global·Local 전환 버튼을 눌러 Transform 편집 기준을 Local로 바꾼다. 그다음 Hierarchy에서 제어할 Bone을 선택하면 해당 Bone의 로컬 축을 Scene View에서 확인할 수 있다.
아래 모델은 Z축이 목표를 향해야 하므로 Aim Axis를 Z로 설정했다. Unity의 Transform Gizmo에서 X축은 빨간색, Y축은 초록색, Z축은 파란색으로 표시된다.

Two-Bone IK로 왼손을 무기에 맞췄다
오른손에 장착된 총을 기준으로 왼손이 무기의 지정된 위치를 잡도록 Two-Bone IK Constraint를 사용했다. Target은 왼손이 도달해야 할 위치와 회전을 제공하고, Hint는 팔꿈치가 어느 방향으로 굽혀지는 것이 좋은지 Solver에 단서를 제공한다.
Hint가 팔꿈치의 위치를 직접 지정하는 것은 아니다. 팔이 굽혀질 방향에 대한 힌트를 주는 역할이므로, 같은 Target을 사용하더라도 Hint의 위치에 따라 팔의 형태가 크게 달라질 수 있다. 무기마다 크기와 손잡이 위치가 다르기 때문에 실제 캐릭터의 모습을 확인하면서 자연스러운 자세가 나오도록 Hint 위치를 개별적으로 조정했다.

Hint 위치에 따른 팔꿈치 방향 예시

위 이미지는 Hint를 올바르지 않은 위치에 배치했을 때의 결과다. Target은 같아도 Hint의 위치가 적절하지 않으면 팔꿈치가 과도하게 올라가거나 몸 바깥쪽으로 꺾일 수 있다.
Rig Builder와 네트워크 IK Controller
캐릭터의 Rig Builder에는 앞서 구성한 Rigs를 Rig Layer로 등록했다. IK의 Weight는 항상 1로 고정하지 않고 애니메이션 상태에 따라 조절한다. 장전 중에는 Weight를 0으로 내려 IK가 손의 위치를 덮어쓰지 않게 하고, 장전 애니메이션이 동작을 온전히 표현하도록 했다.
무기 장착과 해제 기능은 아직 구현하지 않았지만, 이후 같은 방식으로 Weight를 전환할 예정이다. 애니메이션이 직접 표현해야 하는 동작과 IK 보정이 서로 충돌하지 않도록 상태에 따라 영향도를 나누는 것이 목적이다.
IK 제어는 Network IK Controller가 담당한다. 이 컴포넌트는 로컬 캐릭터의 IK를 갱신하는 것뿐 아니라, 멀티플레이 환경에서 다른 캐릭터에게도 조준 및 IK 상태가 올바르게 보이도록 동기화하는 역할을 포함한다.

IK Weight 조절 예시
영상에서는 탄창을 장전하기 직전에 IK를 끄고, 장전 애니메이션이 끝난 뒤 다시 켜는 흐름을 확인할 수 있다.
작업을 마치며
가장 많은 시간이 걸린 부분은 Constraint의 실행 순서를 Hierarchy에 맞추는 작업이었다. 처음에는 IK가 Hierarchy 순서대로 실행된다는 점을 제대로 인지하지 못해 원하는 결과가 나오지 않는 원인을 찾는 데 한참이 걸렸다. Spine 아래에 Head를 배치한 뒤에야 허리가 먼저 움직이고 고개가 이어서 조준점을 바라보는 흐름을 만들 수 있었다.
Multi-Aim Constraint의 Aim Axis를 모델 Bone 방향에 맞게 지정하는 과정도 중요한 시행착오였다. Constraint를 추가하는 것만으로 원하는 방향을 바라보는 것은 아니며, 각 Bone의 축을 직접 확인하고 Offset까지 조정해야 자연스러운 자세를 얻을 수 있었다.
Animation Rigging은 필요한 부위에만 IK를 선택적으로 적용할 수 있다는 점이 좋았다. 반면 Final IK 같은 유료 제품에서 제공하는 Full-Body IK처럼 전신을 한 번에 설정하는 기능이 없어, 척추와 머리, 손을 각각 구성해야 하는 점은 아쉬웠다.
아직 보완할 부분도 있다. 현재 장전 상태를 전환할 때 IK Weight를 1 → 0 또는 0 → 1로 즉시 변경한다. 이 때문에 애니메이션과 IK 사이의 자세가 툭툭 끊겨 보일 수 있다. 이후에는 Weight를 일정 시간 동안 자연스럽게 보간해 두 동작이 부드럽게 전환되도록 개선할 예정이다.