Unity/VR

STEAM VR Interactable.cs 완벽 이해

공훈이 2023. 7. 2. 15:50
반응형

Unity 3D에서 SteamVR을 사용하여 가상현실 콘텐츠를 구현하기 위해서는 SteamVR에 제공되는 플러그인을 활용하여 가상 오브젝트를 제어할 수 있는 콘텐츠를 구현할 수 있습니다.  

 

준비 

AssetsStore - SteamVR Plugin

 

Interactable.cs 

- Steam VR Interactable.cs는 상호작용가능한 객체를 손에 식별합니다. 

역할 : 

1. 컨트롤러 입력감지 : 사용자의 컨트롤러 Trigger(Bool), Grib(Bool), Teleport(Vector2) ..  입력값을 받을 수 있습니다. 

2. 상호 작용 가능한 오브젝트 식별 : 상호작용할 오브젝트에 스크립트를 추가 하여 상호작용 가능한 오브젝트인지를 식별하고 입력에 응답할 수 있다. 

3. 상호 작용 이벤트 처리 : 상호작용할 오브젝트를 잡거나 놓고 이동 또는 회전 시켰을때 이벤트를 작동시킬 수 있습니다. 

4. 충돌 감지 : 스크립트는 오브젝트끼리 충돌을 감지하고 처리하여 이벤트 처리 또한 가능합니다. 

 

Inspector  )

Interactable.cs

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));
}

반응형