Unity + SteamVR SDKチュートリアル Part3

前回に続き、SteamVRのチュートリアルを進めていきます。
使用するチュートリアルは以下の「Using Actions」のセクションからになります
https://www.raywenderlich.com/9189-htc-vive-tutorial-for-unity

Pose Action設定

チュートリアル通りに進めてると、右コントローラ、左コントローラのPose Actionを「SkeltonLeftHand(SkeltonRighthand)」に変更してください。と記述されています。
が、実際に操作してみると、ドロップダウンにSkelton~の選択肢が表示されず、選べるアクションはPoseのみとなっています。
今回のチュートリアルではコントローラの位置が取得できれば良いので、Poseアクションが設定されていることを確認するだけにとどめます。

下図のように、コントローラのPose Actionに「\action\input\default\in\Pose」が設定されていればOKです。

スクリプトの作成

定義したアクションを利用するためにスクリプトを記述します
「Asset > RW > Scripts」配下に「ActionTest」という名前でC#スクリプトを作成します。

作成した「ActionTest」スクリプトを開き、以下の修正を行っていきます

Start()メソッドは不要なので削除します。

ファイルの先頭にUsingを追加します

using Valve.VR;


以下の3つの変数を定義します。

public SteamVR_Input_Sources handType; // インプット状態を取得するコントローラ
public SteamVR_Action_Boolean teleportAction; // テレポートアクションへのリファレンス
public SteamVR_Action_Boolean grabAction; //  グラッブアクションへのリファレンス

Updateメソッドの下に、以下のコードを追加します

public bool GetTeleportDown() // テレポートアクションが押された時の動き
{
    return teleportAction.GetStateDown(handType);
}

public bool GetGrab() // グラッブアクションが押された時の動き
{
    return grabAction.GetState(handType);
}

最後に、Updateメソッドの中に以下のコードを追加します

if (GetTeleportDown())
{
    print("Teleport " + handType);
}

if (GetGrab())
{
    print("Grab " + handType);
}

ここまでで、ActionTestの全体像は以下の通りになります

using UnityEngine;
using Valve.VR;

public class ActionTest : MonoBehaviour
{
    public SteamVR_Input_Sources handType; 
    public SteamVR_Action_Boolean teleportAction;
    public SteamVR_Action_Boolean grabAction; 

    // Update is called once per frame
    void Update()
    {
        if (GetTeleportDown())
        {
            print("Teleport " + handType);
        }

        if (GetGrab())
        {
            print("Grab " + handType);
        }
    }

    public bool GetTeleportDown()
    {
        return teleportAction.GetStateDown(handType);
    }

    public bool GetGrab() 
    {
        return grabAction.GetState(handType);
    }
}

コントローラへのスクリプト割り当て

作成したActionTestスクリプトをコントローラに割り当て、各種設定を行います。
・Controller (left)、Controller (Right)にActionTestスクリプトをアタッチ
・HandTypeに「Left Hand(またはRight Hand)を設定」
・Teleport Actionに「\action\input\default\in\Teleport」を設定
・Grab Actionに「\action\input\default\in\Grab」を設定
詳しくは以下の動画をご覧ください。

動作確認

以上の設定で、コントローラのボタン操作に応じて、コンソールにメッセージが表示されるようになります。
前回のコントローラバインドで、
・テレポートはタッチパッド上
・グラッブはトリガー
にボタンを設定していますので、上記のボタンを押せば、メッセージが表示されます。

コントローラの対応したボタンを押すと、メッセージが表示されるはずです。

今回は以上

今回はインプットの基礎部分を作成しました。
次回は、実際にVR空間のオブジェクトを掴む動作を作成したいと思います