SteamVR Plugin 도입부터 VIVE 컨트롤러 입력 획득까지

15537 단어 ViveUnitySteamVRC#VR
안녕하세요. 야츠바시 마론입니다.

"Unity에서 VR 게임을 개발할 때 필요한 SteamVR Plugin의 도입부터 Vive 컨트롤러로 전후 좌우의 이동과 좌우의 회전이 가능해질 때까지"를 설명합니다.

본 기사에서 해설하는 것은, pixivFANBOX에서 공개하고 있는 모션 캡쳐용 unitypackage 「VR Motion Recorder」로 실장되고 있는 기능 중, SteamVR Plugin의 도입의 부분과, 컨트롤러에 의한 이동·회전에 관한 부분의 실장의 해설이 됩니다.
htps //w w. 피 v. 네 t/푼보 x/c 후 r/16717003/포 st/566230

사용하는 SteamVR Plugin은 ver.2.3.2에서 실시합니다. (2019년 9월 현재 최신)
SteamVR Plugin은 ver.1.x.x에서 ver.2.x.x로 내용이 크게 바뀌어 사용법이 완전히 다른 것이 되었기 때문에 만약 ver.3.x.x가 나오면 이 기사도 사용물이 되지 않을 가능성이 있다고 한다 것은 양해 바랍니다.

환경



Unity(이 기사에서는 Unity2017.4.28f1. SteamVR Plugin의 요건을 충족하면 무엇이든 좋다.)
HTC Vive
SteamVR Plugin ver.2.3.2

소개



· Unity에서 새로운 프로젝트를 만들고 SteamVR Plugin 가져오기

SteamVR 플러그인
( h tps : // 어서 ts 취해. 글쎄, ty. 코 m / Pac 가게 s / 및 ls / Inte g Rachion / s Tea mvr-p ㅅ 긴 - 32647 )

· [CameraRig] 조립식을 히에랄 키에 놓고 재생 버튼을 누릅니다.

·이 화면이 나오므로 Yes를 누릅니다.


・이 화면이 나오므로, 이하의 조작을 실시합니다
①Actions의 오른쪽 하단에 있는 "+"를 눌러 행 추가
② 추가한 행의 Name을 "direction"으로 한다(direction은 변수명이므로 바꿀 수 있다)
③변수의 Type을 vector2로 한다
④ "Save and generate"를 누른다
⑤ SteamVR을 시작하고 Vive의 컨트롤러를 켜고 SteamVR에 컨트롤러를 인식하고 "Open binding UI"를 누릅니다.


⑥상기 ⑤로 브라우저에서 이 화면이 열리므로 "편집"을 누른다.
(Unity 프로젝트 이름에 전각 문자가 있으면 프로젝트가 잘 인식되지 않으므로이 화면이 아닙니다)


⑦ 컨트롤러의 할당 화면이 열리므로, 다음의 화상과 같이 설정한다








자, 지금까지 완료되면 Unity 화면으로 돌아갑니다.

[CameraRig]의 객체에 아래의 PlayerController 스크립트를 첨부합니다.

PlayerContriller.cs

/*
【概要】
VIVEコントローラで前後左右の移動と回転をするスクリプト

左手:タッチパッドの入力で『上下左右』を判定し↑←↓→の移動をする
右手:タッチパッドの入力で『左右』を判定し右回転と左回転をする
*/

using UnityEngine;
using Valve.VR;

public class PlayerController : MonoBehaviour
{
    public SteamVR_Input_Sources lefthandType;
    public SteamVR_Input_Sources righthandType;
    public SteamVR_Action_Boolean teleport;
    public SteamVR_Action_Vector2 direction;
    public Transform _VRCamera;
    public float _Movespeed = 3f;
    public float _Rotspeed = 2f;

    void Update()
    {
        if (CheckGrabLeft())
        {
            Move();
        }
        if (CheckGrabRight())
        {
            Rotate();
        }
    }

    private void Move()
    {
        // HMD(=カメラ)の向いている方向から上下左右に水平方向に進む  
        // 進む方向はCheckDirectionLeft()で計算する
        this.transform.position += _Movespeed * Vector3.ProjectOnPlane(CheckDirectionLeft(), Vector3.up) / 100;
    }
    private void Rotate()
    {
        // HMD(=カメラ)位置を中心として左右に回転する
        // 左右の判定はCheckDirectionRight()で計算する
        this.transform.RotateAround(_VRCamera.position, Vector3.up, _Rotspeed * CheckDirectionRight());
    }
    private bool CheckGrabLeft()
    {
        return teleport.GetState(lefthandType);
    }
    private bool CheckGrabRight()
    {
        return teleport.GetState(righthandType);
    }
    private Vector3 CheckDirectionLeft()
    {
        // タッチパッドのタッチ位置をVector2で取得
        Vector2 dir = direction.GetAxis(lefthandType);
        if (Mathf.Abs(dir.y) >= Mathf.Abs(dir.x))
        {
            // Y方向の絶対値の方が大きければ、HMD(=カメラ)に対して前か後ろ方向を返す
            return Mathf.Sign(dir.y) * Vector3.RotateTowards(new Vector3(0f, 0f, 1f), _VRCamera.forward, 360f, 360f);
        }
        else
        {
            // X方向の絶対値の方が大きければ、HMD(=カメラ)に対して右か左方向を返す
            return Mathf.Sign(dir.x) * Vector3.RotateTowards(new Vector3(1f, 0f, 0f), _VRCamera.right, 360f, 360f);
        }
    }
    private float CheckDirectionRight()
    {
        // タッチパッドのタッチ位置をVector2で取得
        Vector2 dir = direction.GetAxis(righthandType);
        if (Mathf.Abs(dir.y) >= Mathf.Abs(dir.x))
        {
            // Y方向の絶対値の方が大きければ、回転量=0を返す
            return 0f;
        }
        else
        {
            // X方向の絶対値の方が大きければ、回転量= 1か -1を返す
            return Mathf.Sign(dir.x);
        }
    }
}


[CameraRig]의 PlayerController의 Inspector를 다음과 같이 설정합니다.


이제 재생 버튼을 누르면 HMD에 화면이 표시되고 컨트롤러에서 이동·회전을 할 수 있게 됩니다.


🌟🌟🌟 조금 해설🌟🌟🌟
Update 함수 내에서 왼쪽과 오른쪽 컨트롤러의 터치패드를 클릭했는지 여부를 항상 모니터링합니다.
 void Update()
    {
        if (CheckGrabLeft())
        {
            Move();
        }
        if (CheckGrabRight())
        {
            Rotate();
        }
    }

터치패드의 클릭 판정은, 「파라미터.GetState(입력 디바이스)」로 실시합니다.
판정 결과는 boolean으로 돌아옵니다.
private bool CheckGrabLeft()
    {
        return teleport.GetState(lefthandType);
    }

위에서는 매개 변수 = teleport이지만 다음 SteamVR Input에서 설정 한 것이 었습니다.


또, 입력 디바이스=lefthandType입니다만, 그 내용은 Inspector로 설정합니다.


🌟🌟🌟 해설 끝 🌟🌟🌟

SteamVR은 디폴트라고 텔레포트 이동 때문에, VR취하기 어렵지만 이동하기 어렵습니다.
개인적으로는 컨트롤러로 전후 이동과 회전을 하고 싶기 때문에, 이것을 만들어 보았습니다.

이상, 「SteamVR Plugin의 도입으로부터 VIVE 컨트롤러의 입력 취득까지」였습니다!

야츠바시 마론

🌟🌟🌟 이쪽도 들여다봐 🌟🌟🌟
트위터
htps : // 라고 해서 r. 코 m/마론_V 츠베 r
pixivFANBOX (도구 배포)
htps //w w. 피 v. 네 t/푼보 x/c 후 r/16717003
Youtube (도구 해설 및 Vtuber 활동)
htps //w w. 요츠베. 코 m / 찬 l / 즐거운 bLp cj 쟈 hsp8 코 kG56g

좋은 웹페이지 즐겨찾기