패키지 매니저에 들어가서 Animation Rigging 패키지를 다운받는다
준비해둔 휴머노이드 모델에다가 Rig Builder를 추가하고 Animation을 삭제해준다
Bone Renderer를 추가해주고 모델의 Root부분부터 맨 아래까지 다 Transforms안에다가 넣어주면 된다
IK를 만들기 위한 사전 작업으로 빈오브젝트 VR Contraints를 하나 생성해준다음 Rig컴포넌트를 부착해준다
그다음으로 아까 만들어둔 Rig Builder 컴포넌트에 방금 생성한 VR Contraints컴포넌트를 넣어준다
다음으로 VR Contraints자식으로 빈 오브젝트 Right Arm Ik를 하나 만들어주고 거기에 Two Bone IK Contraints 컴포넌트를 만들어준다
Root, Mid , Tip 각각 알맞은 트랜스폼을 할당해주어야 한다
모델의 클릭해보면 아까 Bone Renderer을 추가해서 파란색 뼈대같은것들이 보일텐데 빨간색 어깨(?)을 클릭하면 파란색 테두리가 노란색 테두리가 되는 것을 볼 수 있다
그럼 자동으로 하이러키창에서 누른 팔 부위가 클릭되는데 그거를 끌어다가 놓으면 된다
1번 2번 3번을 순서대로 클릭하고 그거 넣어주면 된다
Right Arm Ik 자식으로 Target 과 Hint를 추가하고
Source Objects의 아래 Target과 Hint에 넣어주면 된다
타켓 오브젝트를 누르고 쉬프트를 누른 상태로 손을 클릭하면 Right_Writs_Joint가 함께 선택된다
그 상태로 상단 Animation Rigging 메뉴바를 누르고 Align Transform을 누르면 Target이 Right_Writs_Joint 위치로 이동한다
Hint도 똑같이 해주는데
가운데 팔에다가 해주면 된다
그리고 Hint는 팔꿈치 약간 뒤에 배치시켜주면 된다
Left Arm IK도 똑같이 세팅해주면 된다
다음으로 Head Contraints를 만들어주고 Mulit-Parent Contraints 컴포넌트를 붙여준다
Constrained Object에는 Head를 붙여주고 Source Objects에는 Head Contraints를 붙여주면 된다
얘도 Align Transform을 통해 머리쪽으로 옮겨준다
VRRig라는 스크립트를 하나 생성하고 캐릭터에 붙여준다
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class VRMap
{
public Transform vrTarget;
public Transform rigTarget;
public Vector3 trackingPositionOffset;
public Vector3 trackingRotationOffset;
public void Map()
{
rigTarget.position = vrTarget.TransformPoint(trackingPositionOffset);
rigTarget.rotation = vrTarget.rotation * Quaternion.Euler(trackingRotationOffset);
}
}
public class VRRig : MonoBehaviour
{
public VRMap head;
public VRMap leftHand;
public VRMap rightHand;
public Transform headContraints;
Vector3 headBodyOffest;
public float smoomthness;
private void Awake()
{
headBodyOffest = transform.position - headContraints.position;
}
private void Update()
{
transform.position = headContraints.position + headBodyOffest;
transform.forward = Vector3.Lerp(transform.forward,
Vector3.ProjectOnPlane(headContraints.up, Vector3.up).normalized, Time.deltaTime * smoomthness);
head.Map();
leftHand.Map();
rightHand.Map();
}
}
OVRCameraRig도 하나 만들어준다
수치를 조정해준다