AnyPortrait > 메뉴얼 > IK 컨트롤러
본 IK 체인을 설정한 상태에서 외부의 본으로 IK를 제어할 수 있습니다.
이 기능을 이용하면 다양한 애니메이션 효과를 줄 수 있습니다.
지형에 따라 발 높이를 바꾸어 조금 더 사실적으로 걷는 애니메이션을 만들 수 있습니다.
또는, 실시간으로 플레이어가 조준하는 위치로 무기를 들고 자세를 취할 수 있습니다.
이 페이지에서는 본 IK 컨트롤러를 설정하는 방법부터, 실제로 게임에서 어떻게 적용할 수 있는지를 다룹니다.
이전 페이지에서 설명되었던 것과 같이 본 IK 체인을 구성한 상태입니다.
IK를 제어할 역할을 하는 본을 생성합니다.
(1) 본을 추가로 생성하고
(2) Helper 본으로 설정합니다.
Helper 본의 기능상 차이점은 없습니다.
(1) IK 체인의 Target 본을 선택합니다.
(2) IK Controller Settings를 Position으로 변경합니다.
(3) Change 버튼을 눌러서 Effector Bone으로서 방금 만든 Helper 본을 선택합니다.
(4) Default FK/IK Weight를 0에서 1로 바꿉니다.
Position Controller는 IK의 Target 본의 위치가 Effector 본과 최대한 동일하도록 IK가 동작하는 모드입니다.
Look At Controller는 IK의 Target 본이 가리키는 방향이 Effector 본을 향하도록 IK가 동작하는 모드입니다.
Default FK/IK Weight는 별도의 가중치 설정이 없다면 적용되는 기본 가중치 값입니다.
1이라면 IK 컨트롤러가 100% 동작하며, 0.5의 값을 가지면 50%만 적용이 됩니다.
이제 IK 컨트롤러가 동작하는지 테스트를 해봅시다.
(1) Transform (Animation) 모디파이어를 추가합니다.
(2) 애니메이션을 만들고 메시 그룹을 선택한 뒤, Transform (Animation) 타임라인을 추가합니다.
(3) Helper 본을 선택하고 타임라인 레이어로 등록합니다.
(4) 키프레임을 생성하고 위치를 수정합니다.
편집 모드를 종료하면 IK 체인이 Helper 본에 도달하도록 움직이는 것을 보실 수 있습니다.
(위 이미지는 편집 모드인 것처럼 표현되었지만, IK 컨트롤러는 편집 모드에서는 동작하지 않습니다.)
IK 체인의 Target 본을 선택하고 이번엔 IK 컨트롤러를 Look At으로 변경합니다.
Look At 방식은 IK 체인의 형태가 크게 바뀌지 않은 상태에서 각 본들이 조금씩 움직여서 목표를 바라보도록 동작합니다.
위에서 미리 만든 애니메이션을 선택하면 Position 방식과 다르게 IK 체인이 Helper 본에 도달하지 않습니다.
대신 Target 본이 Helper 본을 향하며, 전체적으로 본들이 많이 회전하지 않는 특징이 있습니다.
Look At Controller는 Position Controller와 다르게 IK 체인이 없는 상태에서도 동작을 합니다.
자식 본이 없거나, IK 체인이 Disabled 상태인 본에 Look At Controller를 설정하면, 단일 본을 대상으로 IK가 처리됩니다.
IK 체인없이 동작하는 기능은 v1.1.8부터 적용됩니다.
편집 모드에서는 복합적으로 모디파이어를 수정해야하기 때문에 IK 컨트롤러는 동작하지 않습니다.
그렇지만 그 결과를 미리 확인할 수는 있습니다.
(1) 보기 메뉴를 엽니다.
(2) Edit Mode Options > Preview Calculated Bones를 켭니다. (단축키 : Alt+B )
(3) IK 컨트롤러 결과 적용된 결과가 노란색 외곽선으로 보여집니다.
"애니메이션으로 제작하는 FK 방식"과 "IK 컨트롤러로 제어되는 IK 방식"을 가중치로 적절히 섞어서 사용할 수 있습니다.
실제 게임 실행 중에도 제작된 애니메이션이 필요한 경우가 있고, 외부에서 본 IK를 동작시켜야 하는 경우가 다양하게 나타납니다.
이때 가중치 값을 언제든지 쉽게 바꿀 수 있도록 컨트롤 파라미터를 활용합니다.
(1) 컨트롤 파라미터를 생성합니다. 여기서는 "IK Weight"라는 이름으로 만들었습니다.
(2) Type 값을 Float로 설정합니다.
(3) Range의 값을 최소 0, 최대 1로 설정합니다.
(1) Target 본을 선택합니다.
(2) IK Controller Settings의 항목 중에서 Controller Parameter를 체크하고 Change 버튼을 누릅니다.
(3) 생성했었던 컨트롤 파라미터를 선택합니다.
이제 컨트롤 파라미터의 값(0~1)에 따라서 IK 컨트롤러 결과가 반영됩니다.
애니메이션이나 스크립트로 컨트롤 파라미터의 값을 제어하여 사용하실 수 있습니다.
(이 상태에서 "Default FK/IK Weight"는 사용되지 않습니다.)
이제 애니메이션에서 컨트롤 파라미터의 값에 따라서 어떻게 바뀌는 지 확인해보겠습니다.
(1) 앞서 만든 애니메이션을 선택합니다.
(2) Add Timeline 버튼을 눌러서 (3) Control Parameters 타임라인을 추가합니다.
(1) 만들었던 컨트롤 파라미터를 선택하여 타임라인 레이어로 등록합니다.
(2) 키프레임을 만들고, (3) 컨트롤 파라미터의 값을 0으로 설정합니다.
(4) 다음 키프레임을 생성하고 선택합니다.
(5) 이번에는 컨트롤 파라미터의 값을 1로 설정합니다.
컨트롤 파라미터의 값에 따라서 IK가 적용되는 비율이 바뀌는 것을 볼 수 있습니다.
7번째 데모씬은 IK 컨트롤러가 적용된 샘플 게임입니다. (데모 샘플 게임 체험하기)
이 게임에 IK가 어떻게 적용되는가에 대해서 간단히 설명합니다.
샘플 게임에 등장하는 4족 보행 로봇입니다.
플레이어를 따라다니며 폭탄을 발사하여 도와줍니다.
머리 위에 있는 로봇 팔로 폭탄을 발사합니다.
4개의 다리로 좌우로 걸어다닙니다.
4개의 다리는 각각의 IK 체인으로 만들어졌습니다.
발이 땅에 닿는 위치에 Helper 본들이 생성되어있습니다.
이 Helper 본들을 IK 컨트롤러의 Effector 본으로 연결하고 Position 방식으로 설정하였습니다.
Helper 본의 이름은 각각 "Helper Foot Front R", "Helper Foot Front L", "Helper Foot Back R", "Helper Foot Back L"입니다.
폭탄을 발사하는 로봇 팔도 IK 체인으로 만들어졌습니다.
IK 체인으로 속하지 않은 마지막 본은 발사 위치를 알기 위한 소켓 용도의 본입니다.
폭탄을 조준하는 애니메이션을 위해서 "Helper Aim"이라는 이름의 본을 추가하고 IK 컨트롤러로 연결하였습니다.
IK 컨트롤러 타입은 Look At입니다.
IK 컨트롤러를 게임에서 활용하는 개략적인 방법입니다.
실시간으로 발 위치보다 조금 위쪽에서 Raycast를 아래 방향으로 시도합니다.
Raycast 처리가 성공했다면, 땅에 도달한 위치로 Helper 본을 이동시켜야 합니다.
이때, Helper 본을 강제로 이동시킨다면 걷는 애니메이션을 하는 내내 발이 땅에서 떨어지지 않게 됩니다.
apPortrait의 "SetBonePositionConstraintBySurface" 함수를 이용하면 지형에 따라 발 높이가 보정되면서 걷는 애니메이션도 정상적으로 동작할 수 있습니다.
SetBonePositionConstraintBySurface 함수에 필요한 "기준 표면 위치", "현재 표면 위치", "최소/최대 표면 위치"는 씬에서 다른 Transform을 이용하여 설정한 뒤 높이 값을 가져옵니다.
유니티 씬에서 매개변수로 사용할 위치 값을 가져오기 위해 GameObject들을 생성하고 Transform 정보를 참조합니다.
1. Raycast를 시도하는 시작점
2. SetBonePositionConstraintBySurface 함수 매개 변수 중 "최대 표면 위치"
3. SetBonePositionConstraintBySurface 함수 매개 변수 중 "기준 표면 위치"
4. SetBonePositionConstraintBySurface 함수 매개 변수 중 "최소 표면 위치"
RaycastHit2D RaycastHit_RobotFootR = Physics2D.Raycast(FootRaycast_R.position, new Vector2(0.0f, -1.0f), 30);
if (RaycastHit_RobotFootR && RaycastHit_RobotFootR.collider != null)
{
robot.SetBonePositionConstraintBySurface( "Helper Foot Front R",
FootPosY_Default.position.y,
RaycastHit_RobotFootR.point.y,
FootPosY_Min.position.y,
FootPosY_Max.position.y,
ConstraintSurface.Ysurface,
Space.World);
}
게임에서 사용되는 조준점의 위치로 "Helper Aim" 본을 이동시킵니다.
Look At IK 컨트롤러가 동작하기 때문에 그 외의 처리는 필요없습니다.
robot.SetBonePosition("Helper Aim", aimPosition, Space.World);