読者です 読者をやめる 読者になる 読者になる

たこやき部屋

SteamVRを使って、Unityでゲームを開発したい

SteamVR PluginとVRTK Ver3でコントローラのバッテリー残量を表示する

なんだかPlanet CoasterとFF15で遊んでいるうちに、世間ではSteamVR PluginがVer1.2.0になったり、VRTKがVer3.0.1になったりしてました!
特にVRTKはかなり変わったみたいなので、早速新しくなったVRTKを使ってみましょう。
今回は新しいVRTKでテレポート移動を試すのと、Viveコントローラのバッテリー残量を取得し、VRTKのツールチップの機能で表示させてみようと思います。

最初はSteamVR PluginとVRTKのインポートです。Asset Storeから両者をダウンロード・インポートします。
この2つですね。
f:id:takoyakiroom:20170204210912j:plainf:id:takoyakiroom:20170204210913j:plain

インポートが終わったらHierarchyに最初からある「Main Camera」は削除、代わりにStarmVR→Prefabsの[CameraRig]を置きます。
f:id:takoyakiroom:20170204210914j:plain

ついでに、床をCubeで作っておきましょう。
f:id:takoyakiroom:20170204210916j:plain

VRTK用に空のオブジェクトを作成、オブジェクトの名前は何でも良いです。
そのオブジェクトに、VRTK→Scripts→Utilitiesにある「VRTK_SDKManager」をアタッチ。
Inspactorから「SDK Selection」を「StarmVR」にします。他には「OculusVR」とか「Simulator」とかも選べるみたいです。
f:id:takoyakiroom:20170204210917j:plain

んで、下図(1)の「Auto Populate Linked Objects」ボタンを押すと、(2)の部分が自動的に設定されます。
これでSteamVR PluginとVRTKの関連付けが出来たってとこでしょうか。
f:id:takoyakiroom:20170204210920j:plain

次はVR上で移動できるようにテレポートの機能を付けてみます。
まずは、移動先を示すポインタをコントローラの操作で表示できるようにする為、コントローラの設定を行います。

左コントローラのスクリプトを入れる為の空のオブジェクトを作成、これまた名前は何でも良いです。
わかりやすいよう、さっき作った「VRTK」の中に突っ込んでまとめておきます。
そして、コントローラを使う為の「VRTK_ControllerEvents」と、ポインタを使う為の「VRTK_SimplePointer」をコントローラ用のオブジェクトに突っ込みます。
「VRTK_ControllerEvents」はVRTK→Scripts→Interactionsの中、「VRTK_SimplePointer」はVRTK→Scripts→Pointersの中にあります。
f:id:takoyakiroom:20170204210921j:plain

右のコントローラも同じように作成します。(コピペ→リネームでもOK)
f:id:takoyakiroom:20170204210925j:plain

作った2つのコントローラを「VRTK_SDKManager」の「Controller Aliases」のScriptのところに設定します。
f:id:takoyakiroom:20170204210927j:plain

よし、動かしてみよー!
f:id:takoyakiroom:20170204210928j:plain
OK! タッチパッドのボタンを押すとポインタが表示されます。

移動できるようにするには「VRTK_BasicTelepor」を使います。「VRTK_BasicTelepor」はVRTK→Scripts→Locomotionの中です。
これまた空のオブジェクトを「PlayArea」を作って、アタッチしています。
これは特に空のオブジェクトを作らなくても、例えば最初に作った「VRTK」のオブジェクトにアタッチしてもかまわないかと思います。
f:id:takoyakiroom:20170204210930j:plain
「VRTK_BasicTeleport」以外にもいろんな移動方法があるので、気になる方は他のも試してみてください。

動作確認! 画像ではわからないのですが、ちゃんと移動できるようになっています。
f:id:takoyakiroom:20170204210932j:plain

最後にコントローラにツールチップを付けて、そこにバッテリー残量を表示させてみましょう。

オブジェクトにツールチップを表示させるのには「VRTK_ObjectTooltip」を使いました。
VRTK→Prefabs→ObjectTooltipを左右のコントローラのオブジェクトにアタッチします。(「ControllerTooltip」じゃないですよ)
TransformのX,Yをちょっとずらして、ツールチップを見やすい位置に移動しときました。
f:id:takoyakiroom:20170204210934j:plain

動かすとこんな感じ。
f:id:takoyakiroom:20170204210939j:plain

ではバッテリー残量を取得するスクリプトを作成です。
バッテリーの状態はOpenVRの「GetFloatTrackedDeviceProperty」で、引数に「ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float」を使って取得できました。
Floatで0~1の値が返ってきます。「1」は充電満タンで「0」は空っぽです。
ちなみに、引数を変えればバッテリー以外のデバイスの情報も取れます。また文字情報を取ってくれる「GetStringTrackedDeviceProperty」もあります。

作ったスクリプトはこちら

Battery.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;
using VRTK;

public class Battery : MonoBehaviour {
    public enum LorR
    {
        left,
        right
    }
    public LorR type;

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        ETrackedPropertyError err = 0;
        CVRSystem cvrSystem = SteamVR.instance.hmd;

        int deviceIndex = 0;
        if (type == LorR.left)
        {
            deviceIndex = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Leftmost);
        }
        else
        {
            deviceIndex = SteamVR_Controller.GetDeviceIndex(SteamVR_Controller.DeviceRelation.Rightmost);
        }

        // バッテリー残量取得(0~1)
        float val = cvrSystem.GetFloatTrackedDeviceProperty(
            (uint)deviceIndex,
            ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float, ref err);

        // Tooltip更新
        VRTK_ObjectTooltip tip = GetComponent<VRTK_ObjectTooltip>();
        tip.UpdateText((val*100).ToString("0")+"%");
    }
}

左右のコントローラにアタッチして完了!
f:id:takoyakiroom:20170204221056j:plain

無事バッテリーの状態が取得できました。
f:id:takoyakiroom:20170204210940j:plain

尚、残り10%以下になると、実際のコントローラのLEDが赤くなるっぽいです。