컨트롤러 대신 손 모델이 나와서 grip
, trigger
상호작용이 손가락 움직임으로 반영되게 해보기
손 모델로 쓸 파일을 가져와 각각 왼손, 오른손 컨트롤러의 하위 오브젝트로 넣음
scale (-1, 1, 1)
하면 오른손 모델처럼 방향이 바뀜Hand 에 Animator
스크립트 추가 및 아바타 할당
Rig
> Avatar Definition
> Create From This Model
후 Apply 하면 생성됨손이 모두 접힌 경우를 나타내는 close 애니메이션 생성
아바타 마스크 생성
Trigger
: 엄지, 검지만 체크Grip
: 중지, 약지, 소지만 체크Animator
에서 레이어와 float 파라미터 생성
Weight = 1
, Mask
는 앞에서 생성한 아바타 마스크 할당new state
, blend tree
생성 후 아래 그림과 같이 연결
각 레이어에 맞는 조건 할당 및 Exit Time
, Fixed Duration
체크 해제
Hand.cs
: LeftHand, RightHand 오브젝트에 넣기
public class Hand : MonoBehaviour
{
public float speed;
Animator animator;
private float gripTarget;
private float triggerTarget;
private float gripCurrent;
private float triggerCurrent;
private string animatorGripParam = "Grip";
private string animatorTriggerParam = "Trigger";
void Start()
{
animator = GetComponent<Animator>();
}
void Update()
{
AnimateHand();
}
internal void SetGrip(float v)
{
gripTarget = v;
}
internal void SetTrigger(float v)
{
triggerTarget = v;
}
void AnimateHand()
{
if (gripCurrent != gripTarget)
{
gripCurrent = Mathf.MoveTowards(gripCurrent, gripTarget, Time.deltaTime * speed);
animator.SetFloat(animatorGripParam, gripCurrent);
}
if (triggerCurrent != triggerTarget)
{
triggerCurrent = Mathf.MoveTowards(triggerCurrent, triggerTarget, Time.deltaTime * speed);
animator.SetFloat(animatorTriggerParam, triggerCurrent);
}
}
}
HandController.cs
: LeftHandController, RightHandController 오브젝트에 넣기public class HandController : MonoBehaviour
{
ActionBasedController controller;
public Hand hand;
void Start()
{
controller = GetComponent<ActionBasedController>();
}
void Update()
{
hand.SetGrip(controller.selectAction.action.ReadValue<float>());
hand.SetTrigger(controller.activateAction.action.ReadValue<float>());
}
}
Grab 시 손과 물체가 겹쳐져서 보기 좋지 않음 -> Grab 중일 때는 손 숨기기!
Hand.cs
에 다음 내용 추가SkinnedMeshRenderer mesh;
public void ToggleVisibility()
{
mesh.enabled = !mesh.enabled;
}
XR Ray Interactor
> Select Entered
, Select Exited
에 위에서 만든 ToggleVisibility()
함수 추가