[Unity] Steam VR Plugin 2.2.0を動かせたので、やったことを書いてく

#目次
1、[はじめに](#はじめに)
2、[環境](#環境)
3、[目標](#目標)
4、[UnityHubでUnity2018.4.9f1をインストール](#unityhubでunity201849f1をインストール)
5、[Steam VR Unity Pluginをインポートする](#steam-vr-unity-pluginをインポートする)
6、[サンプルシーンを動かしてみる！](#サンプルシーンを動かしてみる)
7、[簡単なワールドを作る](#簡単なワールドを作る)
8、[ワールド内を移動できるようにしてみる！](#ワールド内を移動できるようにしてみる)
8-1、[移動用ゲームオブジェクトの作成](#移動用ゲームオブジェクトの作成)
8-2、[移動用スクリプトの作成](#移動用スクリプトの作成)
8-3、[スクリプト](#スクリプト)
8-4、[アクションの設定](#アクションの設定)
8-5、[バインディング](#バインディング)
9、[おわりに](#おわりに)
10、[参考にさせて頂いたページ](#参考にさせて頂いたページ)

Unityのインスコなんて終わってるよ！！って人は、5あたりから読んでいただければと思います。

#はじめに

バージョンが2.xになって色々変わったSteam VR plugin。
さまざななコントローラーに対応したり、inputを自由に変えられるようになったらしいです。

せっかくなので最新版を使ってみようかなー　と思っていたのですが、2.x系の記事があんまり多くなかったり、
バージョンアップで仕様が変わったりしているところが多く、Unity初心者な私には動かすまでの道のりがとても長かったです…

しかし、とりあえずまあ簡単な動作ぐらいはできるようになったので、私がやったことをとりあえず書いていきたいと思います。
たぶん記事通りにやれば動くぐらいはできるようになるはず…

あとトラッカーとかについてはまだ試していません。トラッカー使ったゲーム作りたいなとか考えてはいるのですが…

#環境
・HTC Vive CE　&　Vive Controller
・Unity 2018.4.9f1(LTS)
・Steam VR Plugin 2.2.0
・Unity Hub 2.1.2


#目標
Unityで簡単なワールドを作成し、VRでその空間内を移動できるようにする。
解説では左トリガーを押すことで、左コントローラーが向いている方向に移動できるようにします。

下のツイッター動画が完成版。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">steam vr plugin2.2.0です <a href="https://t.co/ZbLXY6FZMZ">pic.twitter.com/ZbLXY6FZMZ</a></p>&mdash; AI.きりたん@Vtuber (@Kiritan_Vtuber) <a href="https://twitter.com/Kiritan_Vtuber/status/1179587647561293824?ref_src=twsrc%5Etfw">October 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#UnityHubでunity2018.4.9f1をインストール

Unity Hubはunityのバージョンを管理できる便利なソフトウェア。
複数のunityバージョンを利用するときにとっても便利なので、是非インストールしましょう！

#####[Unity Hubダウンロード](https://unity3d.com/jp/get-unity/download)　
上のリンクからUnity Hubをダウンロードし、ダウンロードされたUnityHubSetup.exeを実行、インストールしてください。

<img src="https://i.gyazo.com/60d6d365e890ce7859149b25f6380f7c.png" width=60%>

Unity Hubのインストールが終わりましたら、起動してもらうと、こんな画面が出てくると思いますので、
画面左のインストールボタンを押し、さらに右上に出てきた水色のインストールをクリック、

<img src="https://i.gyazo.com/857bd738ba92821898aeed3e68abff5e.png" width=60%>

Unity 2018.4.9f1(LTS)にチェックを入れて、追加モジュールの導入画面に移ります。
特に何も追加する必要はないので、実行をクリック。インストールが始まるのでお菓子でも食べて待つのです。

<img src="https://i.gyazo.com/8d17f17edbfbbc465d4f2a1a9324f2d4.png" width=60%>

インストールが終わりましたら、左のタブからプロジェクト一覧に移動し、右上の新規作成をクリック！
テンプレートを3Dにして、好きなプロジェクト名を入力。保存先を確認したら作成をクリックしましょう！
自動でunityのプロジェクトウィンドウが開きます。

<img src="https://gyazo.com/cfc9ff04705df5d9a27fd1f1bdcdb6ac.png" width=60%>
<img src="https://i.gyazo.com/2c6f21507786eb5c6ffd1e99c40af4a4.png" width=60%>
<img src="https://i.gyazo.com/e53ac51c328ac9e06e8a4887070142a8.png" width=60%>


#Steam VR Unity Pluginをインポートする

プラグインはUnityにインポートする必要があります。
今回はv2.2.0を使用することにしました。(それ以外は使い方わからなかったよ！)

#####[SteamVR Unity Plugin v2.2.0](https://github.com/ValveSoftware/steamvr_unity_plugin/releases/tag/2.2.0)
上のリンクから”SteamVR_v220.unitypackage”をダウンロードしましょう。

<img src="https://i.gyazo.com/ec4e6d1dc37e3e99b4fd8ce8a43a7828.png" width=60%>
ダウンロードしましたら、Unityの画面を開いて、左上のAssets→Import Package→Custom Packageを選択します。
先ほどダウンロードしてきた”SteamVR_v220.unitypackage”を選択して開きましょう。
<img src="https://i.gyazo.com/c690c3c0e17a5be9120654ad3d95d045.png" width=61%>
<img src="https://i.gyazo.com/a39782b1bf563782f1c01956c3e76551.png" width=61%>

しばらく待つとこういう画面が出てくると思うので、右下のImportをクリックです！
<img src="https://i.gyazo.com/15c5305ab5e8e901888a7bc531705453.png" width=30%>

再びしばらく待つと、何か黄色い警告マークのついたウィンドウが出てくるかもしれません。
######もし出てきた場合は、左下のAccept Allをクリックしてください。
(私の環境では出てこなかったので画像がないです…)

以上でSteam VR Pluginの導入は完了です。




#サンプルシーンを動かしてみる！
Steam VR Pluginにはオシャレなサンプルが最初から入っています！<del>そんなのいいからリファレンスもっと作って</del>
動作確認がてら動かしてみましょう。


プロジェクトパネルから、
######SteamVR→Interaction System→Samplesを開いてInteraction_Exampleをダブルクリックでサンプルシーンへ移動できます。
<img src="https://i.gyazo.com/a285deae816bb4816fbc85d90d27dd3d.png" width=61%>
<img src="https://i.gyazo.com/fd852867f45188a5e0059795fe8b361e.png" width=61%>
こんな感じの世界が出現すると思うので、SteamVRを起動してコントローラーをキャリブレーションした上で、上の▶マークをクリックです。

<img src="https://i.gyazo.com/bec7e08fda2b1c474d15b8683e648dab.png" width=61%>
下2つのようなメッセージが出てきますので、両方ともYesをクリック！
<img src="https://i.gyazo.com/33d1abc74813cfd35183995c98e41bcf.png" width=35%>
<img src="https://i.gyazo.com/3714513684c51bce2e0d6311ce0621b6.png" width=35%>
Steam VR Input Windowが開きます。
特に何も変更せず、　Save and generateをクリックしましょう。
<img src="https://i.gyazo.com/6a4592f66202ce1970083c4d83b04c0c.png" width=61%>
しばらく待つと、コンパイルが完了し、SteamVR_InputフォルダがAssetsのの下に生成されます。
これでサンプルシーンは動くようになったので、Steam VR Input Windowを閉じ、再び▶マークをクリック！
<img src="https://i.gyazo.com/bec7e08fda2b1c474d15b8683e648dab.png" width=61%>
HMDを被るとサンプルシーンの世界の中にいるはずです！
トラックパッドでテレポートしたり、弓矢を使ったり、ボールを投げたりなどの基本的なアクションが
サンプルシーンの中ではできるようになっています。
<img src="https://i.gyazo.com/921d44de9d87e4ac8a42f7f74fc0231e.jpg" width=61%>

#簡単なワールドを作る
サンプルシーンはちゃんと動きましたか(´･ω･`)？
動いたのであれば、さっそく簡単なワールドを作っていきましょう。

プロジェクトパネルからAssets→Scenesフォルダに移動し、何もないところを右クリック。
Create→Sceneをクリックして新しいシーンを作成しましょう。
シーン名は好きな名前を。
<img src="https://i.gyazo.com/b3743537a30017c4a8642108889f42b9.png" width=61%>
<img src="https://i.gyazo.com/9e0ce3bd9fb572c3aea93c53d40ec275.png" width=61%>
シーン名を変えそこなったときは、作ったシーンにカーソルを合わせてF2を押すと名前を変えられます。
シーンを作成したらダブルクリックでそのシーンに移動です。
<img src="https://i.gyazo.com/664ad06ed41826ab0c6e7250d2cce27d.png" width=60%>
虚無のワールドに出現すると思います。
このままVRで試してみてもいいのですが、ちょっと寂しいし
何か行動できるようにしても何が起こってるのかわからないですよね？
というわけで地形をアセットストアからインポートすることにしました。

▶の再生ボタンの左下あたりにあるAsset Storeをクリック。接続します。

<img src="https://i.gyazo.com/7744021936447d0c338a3bb14ce71b52.png" width=60%>
Free Island Collectionと検索窓に入力すると、1件ヒットするのでそれを選択。
<img src="https://i.gyazo.com/1e994a9dbdb00a4db6055188071325db.png" width=60%>
右上あたりにピンク色で、ダウンロードと出てくると思うので、クリックです。
ちょっと待つとピンク色の枠がインポートに変わるので、それをクリックします。
<img src="https://i.gyazo.com/26629f4b6362095907122c9c5cbab91c.png" width=60%>
なんか出てくるので右下のImportを押してしばらく待ちます。
<img src="https://i.gyazo.com/662d5bc163584da39f7d953c141e31ea.png" width=30%>
インポートが終わりましたら、シーンの画面に戻りましょう。
戻ったらプロジェクトパネルから、Assets→Free Island Collection→Enviroment→Terrianフォルダを開き
Terrian1をセレクト、左側のインスペクタにドラッグアンドドロップします。
<img src="https://i.gyazo.com/7ca9917c5d47ab4a18689947cea1e0f5.png" width=60%>
<img src="https://i.gyazo.com/d197296e63de12ba62783e2e6f3f7f76.jpg" width=60%>
####なんかすごい地形でてきた！！

では、VRでこのなんかすごいワールドに入れるようにしていきましょう。
プロジェクトパネルからAssets→SteamVR→Prefabsフォルダを開き、
[CameraRig]と書かれた青い立方体をインスペクタにドラッグアンドドロップ！
<img src="https://i.gyazo.com/1223f288a3aaa50a2dd5a93f11ff8073.png" width=60%>
ドロップすると、[Camera Rig]がインスペクタに追加されて、シーンビューに直方体が出てきます。
この直方体がルームスケールみたいな感じです。(たぶん)
この直方体の中にHMDと左右のコントローラーが入っています。
インスペクターの[Camera Rig]左にある▼をクリックすると確認できるでしょう。
<img src="https://i.gyazo.com/342f3dc55411453dd807df83e6227957.png" width=60%>
さて、ちょっとこのままでは場所が悪いので、[Camera Rig]と島のTerrianを近づけましょう。
[Camera Rig]を動かしてもいいんですが、今回は都合でterrianのほうを動かしてしまいます><;

Terriaanをセレクトして移動させます。矢印で移動してもいいですが、
Transformから X:-514 Y:-142 Z:-1019　にするといい感じになりました。
<img src="https://i.gyazo.com/04f3e1b81ddff2e95c3883e252cb7f6b.jpg" width=60%>

場所の調整が終わったらSteam VRを起動し、コントローラーをキャリブレートしてから、再生ボタンをクリックです！
ヘッドマウントディスプレイをかぶってみましょう！
######うつくしい！　なんか草も動いてる！　<del>草</del>
<img src="https://i.gyazo.com/3be534021263bc2cb38d146e44fa8d75.png" width=65%>
#ワールド内を移動できるようにしてみる！
<del>コピペでできる(ような気分になれる)VR最終回。</del>
さて、それっぽい空間の中に、VRで出現できることは成功しました！
しかし、現状周りを見渡すことしかできません。これではメガネ屋にある気球を観測するマシンと同じです！
というわけで、コントローラーを使って、ワールド内を移動できるようにしてみましょう。

仕様としては左トリガーを引いている間、左コントローラーの向いている方向に移動する、にします。
いろいろ大変なので地形は貫通できるようにします。

######移動用ゲームオブジェクトの作成
まずは移動用の空のゲームオブジェクトを作成し、[Camera Rig]をその子オブジェクトとして追従させます。
こうすることで、空のゲームオブジェクトを移動させることで、ルームスケールごとHMDとコントローラーを移動させることが可能になります。

一番左のヒエラルキービューの何もないところを右クリックし、Create Emptyをセレクト。
Game Objectというオブジェクトが出現したら、[Camera Rig]をそれにドラッグアンドドロップすることで、子オブジェクトとすることができます。
<img src="https://i.gyazo.com/ef5c910babc4d155a7f2ba49f8641244.jpg" width=60%>
Game Onjectの左に▼がついて、[Camera Rig]がその下に来てればOK
<img src="https://i.gyazo.com/1455e1d27f71c3de2e7f756e9812d303.jpg" width=60%>
######移動用スクリプトの作成
それではGame Objectをコントローラーで動かすためのスクリプトを実装します。
プロジェクトパネルで何もないところを右クリックし、Create→C# Scriptです。
名前は適当にmoveとかにでもしておきます。
<img src="https://i.gyazo.com/d623bc02353ee6474c173e5d420cd253.jpg" width=60%>
<img src="https://i.gyazo.com/b962bd9af5834348092968d7292a05f6.jpg" width=60%>
作成したら、moveスクリプトを開きます。
何かサンプルコードが書かれていると思いますが、すべて削除して、以下のコードに書き換えてください。

######スクリプト
```move.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Valve.VR;

public class move : MonoBehaviour
{

    public SteamVR_Input_Sources leftHand;
    public SteamVR_Input_Sources rightHand;
    [SerializeField]
    private GameObject leftcontroller;

    void Start()
    {

    }

    void Update()
    {
        if (SteamVR_Input.GetState("touching", leftHand))
        {
            this.transform.position += leftcontroller.transform.forward * Time.deltaTime * 3f;
        }
    }
}
```
----------
コードの簡単な解説をしていきましょう。とりあえず動けばいいって場合はスルーしてもいいです。

4行目　　　 VRを扱うスクリプトはこれを記述する必要があります。
9,10行目　　どのコントローラーのインプットをなんのpublic変数にあてがうかを決定します。 
11,12行目　左コントローラーの向きを取得するために、左コントローラーのゲームオブジェクトを指定します。
　　　　　　[SerializeField]にしてあるので、後でインスペクタから指定です。
21行目　　　コントローラーで、ユーザーが変数を割り当てたボタンが押されている間処理を行います。
　　　　　　GetStateDownにすることでボタンが押された瞬間に
　　　　　　GetStateUpにすることでボタンが離された瞬間のみ判定が行われます。
23行目 　　 左コントローラーの向いている方向に、GameObjectとその子オブジェクト[Camera Rig]を移動させます。
　　　　　　最後の *3f　の数字を変えることで移動速度を変更できます。
 
----------
さて、書き終わりましたらコードの内容を保存したうえで閉じましょう。

そうしましたら、ヒエラルキーからGameobjectを選択し、右側のインスペクタを見てみましょう。
Move(Script)という枠が増えてるはずです。
<img src="https://i.gyazo.com/0badd5403fbd207afc647f4571db9607.jpg" width=60%>
Left Hand、Right Handをそれぞれタブから選択します。
ちゃんとLeft HandにはLeft Hand、Right HandにはRight Handを選択してあげましょう。
ちなみに、ここでwaistとかchestなどを選択するとトラッカーを割り当てることが可能になるっぽいです。

その設定が終わったら、[Camera Rig]の子オブジェクトの、Controller (left)をLeft Controllerにドラッグアンドドロップしましょう。
<img src="https://i.gyazo.com/08f901a44363019108bb65a05fccdcd9.jpg" width=60%>

これでスクリプトの実装は終わりです。
最後に、どのボタンを押したとき、move.csの"touching"を呼び出すかを指定していきます。

######アクションの設定
左上のWindowsからSteamVR Inputを開きます。
<img src="https://i.gyazo.com/83be003effa58cced463099f2d32dab0.jpg" width=60%>
前も見たような画面が出てきますので、左上のDefaultsと書かれた下のタブを選択して、per handを指定します。
これで左右のコントローラーにそれぞれ違う入力を持たせることが可能です。

次に、Actions→Inの枠の中にある ＋ をクリックして、新しいアクションを作成します。

<img src="https://i.gyazo.com/cf49a7bf1b9f570b35de5eae8cf5057d.png" width=60%>

先ほどのスクリプトの、touchingを呼び出すために、NameはtouchingにTypeはBooleanにしましょう。
設定が終わったら Save and generateです！
<img src="https://i.gyazo.com/ab553df6cdeaa9037c75a83cc7247842.png" width=60%>
######バインディング
しばらく待ってコンパイルが終わったら、Open binding UIをクリックして
touchingをどのボタンに割り当てるかを指定します。
割り当ての際には、コントローラーの電源をつけてキャリブレートしておきましょう。
<img src="https://i.gyazo.com/68461661868945a5632e5b78fb2acd0b.png" width=60%>
真ん中あたしの編集をクリックです。
<img src="https://i.gyazo.com/e69fa15c5484fa208761056d01a463d8.png" width=60%>
binding設定画面に移りますので、touchingを割り当てたいボタンを選んで、枠左下の鉛筆マークをクリック。
割り当てたいボタンのタブからtouchingをセレクトします。
今回は、左トリガーを引いたときにtouchingを呼び出したいので、左トリガークリックをtouching、プルをなしに設定しました。
<img src="https://i.gyazo.com/d5c7db256e9d7724ed806936c9fa7124.png" width=60%>
Viveコントローラーのボタンの各名称はこんな感じになっています。
<img src="https://shinrinmusic.com/wp-content/uploads/2018/08/33-9.png" width=45%>
ちゃんと設定できてることを確認してから、下のデフォルトバインドの置換をクリックしましょう。
これで全作業が終了です。
<img src="https://i.gyazo.com/a7f51f4dbafc240406e710432f2cf3e4.png" width=60%>
######動けましたか？
もしbindingの読み込みに失敗しましたみたいな画面が出た場合は、Steam VRを再起動するといいでしょう。

#おわりに
これで、最低限VRでの移動や操作などができるようになったと思います。
コントローラーのボタンを押したときの処理をいろいろいじったり、左トリガーだけじゃなくもっといろいろなボタンに
操作を割り当てたりすることで、ゲームっぽいものを作ることもできるかもしれません！

私も最近Steam VRをunityで使い始めたばかりなので、多くのことはわかりませんが、
わからないところなど、コメントの方で質問していただければもしかしたら答えられるかもです。

間違っているところなどもありましたら、コメントのほうでバシバシ指摘していただけると幸いです！><;
では！

#参考にさせて頂いたページ
#####[SteamVR 2.2.0 new Input System Tutorial.](https://medium.com/@danielle.co3tz33/steamvr-2-2-0-new-input-system-tutorial-3fef5e275828)　

#####[SteamVR Plugin 2.0 Input取得・入力関連スクリプト読み解き](https://qiita.com/kyourikey/items/232f7810769c7727c9bd)