Unity 3D에서 SteamVR을 사용하여 가상현실 콘텐츠를 구현하기 위해서는 SteamVR에 제공되는 플러그인을 활용하여 가상 오브젝트를 제어할 수 있는 콘텐츠를 구현할 수 있습니다.
준비
AssetsStore - SteamVR Plugin
Interactable.cs
- Steam VR Interactable.cs는 상호작용가능한 객체를 손에 식별합니다.
역할 :
1. 컨트롤러 입력감지 : 사용자의 컨트롤러 Trigger(Bool), Grib(Bool), Teleport(Vector2) .. 입력값을 받을 수 있습니다.
2. 상호 작용 가능한 오브젝트 식별 : 상호작용할 오브젝트에 스크립트를 추가 하여 상호작용 가능한 오브젝트인지를 식별하고 입력에 응답할 수 있다.
3. 상호 작용 이벤트 처리 : 상호작용할 오브젝트를 잡거나 놓고 이동 또는 회전 시켰을때 이벤트를 작동시킬 수 있습니다.
4. 충돌 감지 : 스크립트는 오브젝트끼리 충돌을 감지하고 처리하여 이벤트 처리 또한 가능합니다.
Inspector )
Hide hand On Attach
- 객체를 잡았을때 손을 보여줄지 안 보여줄지 여부를 체크합니다.
True : 객체를 잡았을때 컨트롤러(손)가 보이지 않습니다.
False : 객체를 잡았을때 컨트롤러(손)가 보이게 됩니다.
Hide Skeleton On Attach, Hide Controller On Attach
- 객체를 잡았을때 사용자 손 또는 컨트롤러를 보여줄지 여부
Use Hand Object AttachmentPoint
- 객체를 잡을때 지정한 포인트(Transform) 기준으로 객체가 잡히게 됩니다.
- 잡을 객체에 SteamVR_Skeleton_Poser 설정을 한 경우 SteamVR_Skeleton_Poser.cs에서 따로 설정이 가능합니다.
Attach Ease In, Snap Attach Ease InTime, Snap Attach Ease In Complete
- 객체를 잡을때 이벤트 처리를 위한 딜레이를 체크할 수 있습니다.
Hand Follow Transform
- 객체를 잡았을때 컨트롤러 객체 자식으로 종속되어 작동됩니다.
True : 컨트롤러 자식으로 종속
False : 개별로 위치값 적용
Highlight On Hover, Hide Highlight
물체와 충돌했을때 테두리 효과를 추가할 수 있습니다.
주의사항
> 객체에 SteamVR_Skeleton_Poser.cs를 설정한 경우 Hide hand On Attach는 False 값을 설정해 줘야 손모양을 만든 값이 보일 수 있습니다.
> Hand Follow Transform를 True로 설정했을 경우 객체를 잡고 놨을때 원래 종속되었던 객체에 빠져나와 개별로 떨어지기 때문에 다시 설정을 해줘야 합니다.
사용방법
//객체가 손(컨트롤러)에 닿았을때
private void OnHandHoverBegin( Hand hand )
{
generalText.text = "Hovering hand: " + hand.name;
}
//객체가 손(컨트롤러)에 닿았다가 떨어졌을 때
private void OnHandHoverEnd( Hand hand )
{
generalText.text = "No Hand Hovering";
}
//객체가 손(컨트롤러)에 닿아있는 상태에 매프레임마다 반복 호출되는 함수
private void HandHoverUpdate( Hand hand )
{
generalText.text = "HandHoverUpdate";
}
//객체가 손(컨트롤러)에 닿은 후 잡혔을 때
private void OnAttachedToHand( Hand hand )
{
generalText.text = string.Format("Attached: {0}", hand.name);
attachTime = Time.time;
}
//객체가 손(컨트롤러)에 잡혔다 놔졌을 때
private void OnDetachedFromHand( Hand hand )
{
generalText.text = string.Format("Detached: {0}", hand.name);
}
//객체가 손(컨트롤러)에 잡혀 있을 때 매 프레임마다 호출되는 함수
private void HandAttachedUpdate( Hand hand )
{
generalText.text = string.Format("Attached: {0} :: Time: {1:F2}", hand.name, (Time.time - attachTime));
}