유니티 2D 캐릭터 제작 방법 요약 [Bone, Rig, IK]

Unity 엔진은 다양한 방식으로 게임 캐릭터를 개발할 수 있습니다. 가장 기본적인 방법이 게임 프레임을 고정하고 매 프레임마다 캐릭터 이미지를 바꿔주는 방법이지요. 아티스트의 능력에 따라 가장 만족스러운 결과물이 나오기도 하지만 엄청난 시간이 걸리는 작업입니다.

그래서 시간을 절약할 수 있는 방법이 나왔습니다. 그림을 하나 그리면 그 그림에 뼈를 심고 살을 붙여 각각의 뼈를 움직여 주는 방법입니다. 이번 게시글에서는 해당 방법을 간단하게 정리해 보겠습니다.

📑유니티 에디터 버전: 2020.3.31f1

목차
[1] 캐릭터 각 부위마다 레이어를 다르게 하자
[2] 유니티 에디터에서 Rigging 한다
[3] Geometry를 하여 메쉬 구조를 만든다
[4] Bone 영향력 수정
[5] IK(Inverse Kinematics)

[1] 캐릭터 각 부위마다 레이어를 다르게 하자


각 부위마다 레이어를 다르게 설정하는 게 개인적으론 편했습니다. 유니티 sprite editor에서 각 레이어 별로 선택해서 sprite(2D 이미지 에셋)를 제어할 수 있기 때문에 작업하기 더 편합니다. 그리고 레이어 별로 나누면 가려져서 안 보이는 부위까지 그릴 수 있기 때문에 더 자연스러운 애니메이션을 기대할 수 있습니다.

그런데 굳이 레이어 별로 안 나눠도 되긴 합니다. 나중에 bones에 weight 할 때 손이 조금 더 많이 갈 뿐이죠.

그리고 중요한 것이 .psb 확장자 파일로 저장해야 합니다. 현재로서는 레이어 별로 나눠진 작업 파일을 정상적으로 읽히는 방법이 .psb 확장자 밖에 없습니다.

[2] 유니티 에디터에서 Rigging 한다


(1) 프로젝트에서 게임 캐릭터 에셋을 선택합니다. (2) 인스펙터에서 Sprite Editor 버튼을 선택하여 Sprite Editor 창을 엽니다.

Sprite Editor 왼쪽 상단에 드롭 다운 버튼을 클릭하여 Skinning Editor로 바꿉니다.

왼쪽에 여러 도구가 보입니다. 크게 세 가지 주요 기능을 세분화해 놓은 도구들입니다. Bone, Geometry, Weight인데요. 간단하게 기능을 설명하자면,

Bone은 말 그대로 캐릭터의 뼈입니다.

Geometry는 스프라이트를 Bone의 근육(또는 살)으로 작용하도록 범위를 설정하는 기능입니다.

Weight는 스프라이트와 Bone이 얼마나 엮어있는지 가중치를 결정합니다. 예를 들어 가슴 Bone을 움직일 때 골반 스프라이트도 조금 움직이게 설정하고 싶다면 Weight를 설정해야 합니다.

이 중에서 역시 가장 먼저 해야 하는 일은 Bone를 심는 것입니다. 왼쪽에 Create Bone 도구를 선택하고 필요한 부위에 뼈를 심습니다.

반드시 자식 관계로 있어야 되는 Bone이 있다면 (1) 부모로 있어야 되는 Bone을 클릭하면 해당 Bone에 주황색 테두리가 생긴 것을 볼 수 있으며, (2) 다음 생성될 Bone은 주황색 테두리 Bone의 자식 관계가 된다는 것을 의미합니다.

더 이상 자식 관계로 생성할 필요가 없다면 <마우스 우측 클릭>을 하면 벗어날 수 있습니다.

[3] Geometry를 하여 메쉬 구조를 만든다


Bone을 다 심었으면 (1) Auto Geometry 버튼을 클릭하고 우측 하단에 있는 Generate For Selected 버튼을 클릭합니다. Auto Geometry 도구를 사용하는 이유는 일일이 Vertex를 찍어 설정하는 것보다 자동으로 만든 다음 수정하는 게 훨씬 빠르기 때문입니다.

Outline Detail 속성 값은 스프라이트(2D 이미지)에선 적당한 게 좋습니다. 100으로 해 놓으면 Vertex가 너무 세밀하게 생성돼 수정하기 더 힘들어져요.

그러면 이런 알록달록하고 괴기한 게 생기는데요, 왼쪽 도구 창에서 Preview Pose를 선택하고 Bone을 이리저리 움직여보세요. 개발자가 원하는 대로 만들어졌나 확인하는 단계입니다.

이렇게 과한 포즈를 취해보면 뭐가 잘못됐는지 알 수 있습니다. 이제 이걸 수정해야 합니다.

[4] Bone 영향력 수정


수정하기 전 Bone의 이름을 위치에 맞게 수정합니다. 미리 해둬야 편합니다.

위 사진을 보면 오른쪽 다리가 이상한 걸 볼 수 있습니다. Leg-R Bone이 움직이면 따라 움직여야 하는데, 아예 안 움직이죠. Auto Geometry를 하면 편하지만 이런 단점이 있습니다. 가끔 전혀 맞지 않은 부위가 엮어지기도 합니다. 이런 걸 수정합시다.

(1) Bone Influence 도구를 선택하고 (2) 수정할 스프라이트를 Visibility에서 선택합니다. (3) 오른쪽 하단에 보면 Leg-R 스프라이트에 엮어있는 Bone이 나오는데, 오른쪽 다리 Bone이 아니라 Pelvis(골반)가 엮어있군요. Pelvis를 선택하고 -(마이너스) 버튼을 클릭해 지워줍니다.

Leg-R 스프라이트에 엮어야 할 Bone을 추가합니다. 오른쪽 다리 Bone을 추가해야겠지요. 하지만 Bone만 엮는다고 해서 스프라이트가 Bone의 움직임에 영향을 받는 것은 아닙니다. 가중치를 설정해야 하는데요, 가중치는 Weight Brush 도구를 사용하여 설정합니다.

(1) Weight Brush 도구를 선택합니다. (2) Visibility에서 원하는 스프라이트를 선택합니다. (3) 그럼 오른쪽 하단에 선택된 스프라이트에 해당하는 Weight Brush 창이 나옵니다.

위 사진의 경우엔 Leg-R 스프라이트에 2개의 Bone이 있습니다. 무릎 기준으로 위쪽 Bone과 아래쪽 Bone이죠. (3) 무릎 위쪽 Bone(Leg-R_0)을 선택하고 (4) 브러시로 Bone에 엮이길 원하는 Vertex를 클릭하여 선택합니다. 정상적으로 가중치가 설정되면 스프라이트가 Bone 색깔로 바뀝니다. 만약 브러시로 Vertex를 클릭해도 원하는 Bone으로 Weight가 설정되지 않는다면 Hardness 값을 올려서 Vertex를 클릭하세요.

이제 원하는 대로 움직이는 모습을 볼 수 있어요. 위 방법대로 이상한 곳은 모두 수정합시다.

Weight 수정 작업을 마쳤으면 우측 상단에 있는 Apply 버튼을 클릭해 저장합시다.

[5] IK(Inverse Kinematics)


위 사진은 지금까지 작업한 게임 오브젝트입니다. 이제 이 게임 오브젝트에 컴포넌트를 연결하여 IK 설정을 할 차례입니다.

IK는 관절 끝부분의 Bone에 생성합니다. IK 게임 오브젝트에 영향을 받는 Bone은 IK 게임 오브젝트가 움직이면 같은 방향으로 움직이는데, 연결돼있는 다른 Bone들도 자연스럽게 움직이게 해줍니다. 자세한 건 직접 하면서 보도록 하죠.

제가 생성할 IK 게임 오브젝트 위치는 손, 발 그리고 머리입니다.

IK를 추가할 게임 오브젝트에 IK Manager 2D 컴포넌트를 추가합니다. 저는 검색해서 추가하는 편입니다.

그리고 IK Solvers에서 + 버튼을 눌러 Limb를 추가합니다.

그럼 IK Manager 2D를 추가했던 게임 오브젝트 자식으로 새로운 게임 오브젝트가 생성됩니다. 해당 게임 오브젝트가 IK 게임 오브젝트입니다.

Limb Solver 2D 컴포넌트에 Effector 필드가 있는데 여기에 원하는 Bone을 레퍼런스로 참조하면 됩니다.

하지만 그전에 생성된 게임 오브젝트(New LimbSolver2D)의 이름을 적절하게 바꿔주는 게 좋습니다. 손에 해당하는 Bone을 레퍼런스로 참조시킨다고 치면 Hand-IK 이런 식으로요.

위 사진은 오른손 Bone(Hand-R_1) 게임 오브젝트를 Effector의 레퍼런스로 사용하였습니다. 그리고 아래에 있는 Create Target 버튼을 클릭하면 Target 필드의 레퍼런스가 생깁니다. 해당 게임 오브젝트가 캐릭터를 움직여줄 IK Target입니다.

위 사진을 보면 IK Target이 움직이면 설정돼있는 Bone이 함께 움직이는 게 보이죠. 이 작업을 머리, 발, 나머지 손에도 반복해 생성합니다.

이제 IK Target을 적절하게 움직여 원하는 캐릭터 애니메이션을 생성할 수 있습니다. 캐릭터 애니메이션은 개인의 노하우와 막노동이 있는 부분이라서 직접 해보는 수밖에 없습니다.