본문 바로가기
Unity/VR 개발하기

[Steam VR 사용하기] 7. Vive Controller Basic Function 구현하기

by 민트코코넛 2021. 9. 12.
728x90
반응형

▶ Vive Controller Button 기능 사용, 동작 구현하기
> Controller에서 사용가능한 Button 기능
>> Menu, Trigger, Grip, Pad, System
>>> System 버튼은 Vive, Oculus 등 하드웨어 제작사에서 자체적으로 설정해놓은 구동 옵션이 있으므로, 개발자가 자체적으로 System 버튼에 어떠한 옵션을 추가한다면, 기본적인 기능을 제외하는 코드를 구현하거나, System 버튼을 사용하지 않는 방향으로 구현하는 것이 좋다.
>> Button 기능의 Type은 Boolean으로 설정하자. | Trigger의 경우, Vector 1 type도 사용가능하다.
>> TrackPad의 경우, 버튼으로서의 기능과, 조이스틱으로서의 기능을 모두 사용할 수 있으므로, 상황에 따라서 설정.
> Unity 상단 - Window - SteamVR Input - Custom Action Set을 선택하고, Actions 에서 구현하고자 하는 기능을 추가.

>> Save and generate로 저장, Binding UI를 열어서, Controller와 Action을 연결해주기.
>> Binding UI에서 Current Binding으로 설정된 Binding Data의 Edit 버튼을 누른다.
>> Action과 Controller의 part를 Button형식으로 연결하고 Replae Default Binding 버튼으로 저장한다.
이후, Binding UI를 종료한다.

>> Binding UI와 Input Action Data의 연결 설정이 완료되었다면, 해당 기능이 동작하도록 Script로 구현한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;                                             // Steam VR namespace. Steam VR plugin을 사용할 때는 무조건 사용해야 한다.

public class ViveInputCtrl : MonoBehaviour
{
    private void FixedUpdate()
    {
        ClickGrab();
        ClickMenu();
        ClickTrigger();
        ClickTrackPad();
    }

    public SteamVR_Action_Boolean Grab;
    public SteamVR_Action_Boolean Menu;
    public SteamVR_Action_Boolean Trigger;
    public SteamVR_Action_Boolean TrackPad;
    // Menu 버튼 동작 구현
    void ClickMenu()
    {
        if (Menu.GetStateDown(SteamVR_Input_Sources.Any))
        {
            Debug.Log("Menu Button Down");
        }
    }
    // Trigger 버튼 동작 구현
    void ClickTrigger()
    {
        if (Trigger.GetState(SteamVR_Input_Sources.Any))
        {
            Debug.Log("Trigger State");
        }
    }
    // TrackPad 버튼 동작 구현 
    void ClickTrackPad()
    {
        if (TrackPad.GetState(SteamVR_Input_Sources.LeftHand))
        {
            Debug.Log("Left Pad Click");
        }
        else if (TrackPad.GetState(SteamVR_Input_Sources.RightHand))
        {
            Debug.Log("Right Pad Click");
        }
    }
    // Grab 버튼을 누를 때 반응하도록 생성
    void ClickGrab()
    {
        // Action을 기기의 part를 통해서 호출할 때는, Input에서 생성한 순서 반대로 실행한다.
        // binding -> type -> name -> Action 
        if (Grab.GetStateDown(SteamVR_Input_Sources.Any))
        {
            Debug.Log("Grab Button Down");
        }
    }
}

>> SteamVR_Action : SteamVR Input에서 생성한 Action 호출
>> SteamVR_Action_Booleam : Input에서 생성한 Action의 type이 boolean인 Action을 특정할 때 호출
>> SteamVR_Input_Sources : 착용하는 장비 중에서 어떤 장비에서 해당 값을 가져올 것인지 확인하는 것
>> SteamVR_Input_Sources.Any : 어떤 장비여도 상관없이 가져오겠다는 것
>> 특정 장비에서 가져오겠다고 한다면, 해당 장비의 명칭을 호출할 것

>> GetState = GetMouse, GetButton 과 동일한 기능을 하는 function
>> GetState : 기기의 어떤 버튼을 지속적으로 누르고 있는 상태
>> GetStatDown : 기기의 어떤 버튼을 한번 누른 상태
>> GetStateUp : 기기의 어떤 버튼을 한번 눌렀다가 땐 상태

>> Script로 Custom Action Set을 호출하여 재생했을 때, 장비의 Model이 출력되지 않을 수 있다.
>> 이때, Player 객체 하위에 포함되어 있는 Controller 객체에 설정된 Steam VR_Behavior_Pose (Script) component를 수정해주어야 한다.

>> 여기서, Pose Action이 defaul Action Set로 설정되어 있기 때문에, 이 부분을 수정하지 않으면, Customizing한 Action Set에서는 Pose 데이터가 출력되지 않는 것.

> Pose Data를 Custom Action Set으로 설정하기.
>> Window - Steam VR Input - Pose Action - Pose Type 만들기

>> Binding UI에서 Pose Action 연결하기 - 중앙의 Edit Action Poses 버튼 클릭

>> Pose로 인식될 위치 옆의 Unused 버튼을 클릭하고, Pose로 변경하기

>> 기본적으로 변경할 대상 : Hand Base, Front, Grip

>> Replace Default Binding으로 저장하고, Pose 편집하기
>> Left, Right Controller의 Pose Action을 각각 Custom Set으로 변경해야 양쪽 controller에 적용된다.

>> 정상적으로 모델이 출력되는지, 기능이 작동하는지 확인하기.

>> 만약, 위와 같이 모델이 현실의 움직임과 동일하게 움직이는 것이 아닌, 전후좌우, 상하 반전이 일어난다면, Binding UI를 열고, Edit Action Poses에서 Base와 Front의 Pose 설정을 Unused로 변경, Hand Grip만 Pose로 설정하여 저장하고, 재실행하면 반전이 사라진다.

728x90