UnityでSteamVR Pluginを利用してゲーム作った話 -準備編-

# この記事の内容
ポートフォリオの一環としてUnityとSteamVR Pluginを利用してゲームを作ったお話を適当に纏めたものの準備編

# 予備知識
- VR環境でのゲームプレイやQuest2などのHMD
- C#とUnityのプログラミング技術

知らないとちょっときついかも
## 経緯
一応ゲーム会社志望だったため、専門学校で作ったフレームワークを利用して、3Dゲームを制作したが、ゴミ以下の出来だったため短期間で何か作品を作れないかと思案し、過去Wii Sports Resortをやっていたことを思いだし、操作感が似ていると思い、居合切りモードをVRで実装してゲームとすることを思いつき、実行に移した。

## 環境構築
EditorVerは2022.3.29.f1
Unity->NewProject->3D(Built-In Render Pipeline)でプロジェクトを新規作成
UnityStoreの[SteamVR Plugin](https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647?locale=ja-JP&srsltid=AfmBOoppzx54sSq2rXVicNvOXhSpiyA0ffa4OzJcm8-RxScIotMZ6JtE)をインポートする

https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647?locale=ja-JP&srsltid=AfmBOoppzx54sSq2rXVicNvOXhSpiyA0ffa4OzJcm8-RxScIotMZ6JtE

***ちなみにこれはSteamやPortalシリーズで有名なValveが制作している。***
インポートが終了すると場合によるが再起動を促す表示とSteamVR_UnitySettingWindowとかいうのが出てくるがとりあえずIgnore Allを押して再起動しておけばいい。
これで環境構築は終了である
## サンプルを見る
SteamVRPluginにはとても豊富なサンプルがあるため、見ておきたい。
ということで
```
"\Assets\SteamVR\Simple Sample.unity"
```

<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/ba7dc567-6807-b375-c4fe-9c2bcbbff95a.png">


開くとスフィアとカメラリグ、床の貼られた空間のシーンが出てくる。
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/6daeff8c-318d-8246-6c1f-e77e38222928.png">
実行するとスフィアが跳ねている状態になる(静止画だけど)。
そろそろVRを確認しよう、ヘッドセットとSteamVRを起動する。
その後に実行すると、なんとヘッドセットに目の前のスフィアがバインバインしている謎光景が！！
他にも...
```
"Assets\SteamVR\InteractionSystem\Samples\Interactions_Example.unity"
```
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/296b56e3-2a8d-7253-8e46-9e4f949ee89d.png">

このようなサンプルもある。
パスの名前にもある通りInteractions、日本語で直訳すると相互作用だが ***物体との干渉***と考えればいい。
このサンプルシーンは物を投げたり、弓を撃ったり、なんか色々出来る、ここをじっくり楽しむのもいいかもしれない。

## プレハブを見てみる
サンプルを触り様々な事が出来ることを知れたので、次は実際に何がどのような動きをしているのかを軽く確認する。
シーンを新たに作成、Basic(Built-In)でよい。

次にユーザーがVRを実行できるためのプレハブを配置する。
さて、今までのサンプルシーンの中のどれがユーザーだろうか？

<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/ba7dc567-6807-b375-c4fe-9c2bcbbff95a.png">

このシーンの中にあるオブジェクトは
- Directional Light
- Floor
- CameraRig
- Sphere
である。

### クイズ：どれが目的のプレハブ？
<details><summary>答え</summary>

***CameraRig***

</details>

まぁ流石にわかるよね、ということでCameraRigの中身を見てみる。
```
"Assets\SteamVR\Prefabs\[CameraRig].prefab"
```
これが目的のプレハブである。
![スクリーンショット 2024-09-19 134112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/05694be5-9fdc-19eb-174a-c1863b5dde8f.png)
思ったよりも中身スカスカやな...


CameraRigにはこのSteam VR_Play Areaというコンポーネントがある。
![スクリーンショット 2024-09-19 134410.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/70b3b451-adcc-0f18-50cb-286dcf3204c8.png)
これはプレイエリア、動き回れる場所を表示するためのコンポーネントである。


ControllerにはこのSteam VR_Behaviour_Poseというコンポーネントがある。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/20a3719c-b51f-b821-8ea2-5b4b4944f2ec.png">

これはコントローラー、もしくはトラッカーなどの実際にある機材の場所を示している。
SteamVR_Behaviour_Poseでは持っているコントローラーの位置や角度などが取得できたりするが、とりあえずはそんなものあるんやな～程度にしといてください。


その下の階層、ModelにはこのRender Modelコンポーネントがある
![スクリーンショット 2024-09-19 135230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/09dce877-ba93-787c-6734-b607969fa2a5.png)
読んで字の通り、モデルを描画するコンポーネントで、コントローラーが表示されるのはこれのおかげである。

最後のCameraには![スクリーンショット 2024-09-19 135626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/122d68e7-f40d-6cac-be58-254c4f3af779.png)
Camera Helperというコンポーネントはある...が、実はこれただのカメラをヘッドマウントディスプレイに合わせてくれるだけのやつであり、実は***カメラさえあれば動く***。
...あれ？
<img width="1000" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/296b56e3-2a8d-7253-8e46-9e4f949ee89d.png">
![スクリーンショット 2024-09-19 140047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/72a05eb3-01c9-4c9d-c9b0-8203d3e555dc.png)
#### [CameraRig]プレハブが...ない...?
そう、Interactions_ExampleシーンにはCameraRigプレハブが無い。
ならどれが代わりの役割を果たしているのか？答えは簡単、***Playerプレハブ***である。
Playerプレハブは非常に色んな要素がぶち込まれてるので一つずつ解説する気にはなれない面倒くさい、ので[公式のドキュメント](https://valvesoftware.github.io/steamvr_unity_plugin/articles/intro.html)読むかChatGPTにでも聞いてください。

https://valvesoftware.github.io/steamvr_unity_plugin/articles/intro.html

VRの環境について段々わかってきたかもしれない

## InputManagerを見る
Binding...そうキーバインドである...（Keyじゃない気もするけど）
正確にはInputManagerの設定を確認する
***Window\SteamVR Input***を選択して開く
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/1a39f946-683e-8d1e-4a50-4a6fecdbb8b4.png">
撮り忘れたけど初期設定を自動で行いますか？(Y/N)みたいなウィンドウが出てくるがYesを押しておけば大丈夫。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/0c9bd015-d334-787a-e2cc-ce55486a9830.png">

恐らくこの画面を見て君はよくわからん...と思っただろう。
ということでSteamVRの入力について再確認を行う

https://steamcommunity.com/sharedfiles/filedetails/?id=2029205314

この資料を読んでくれ（丸投げ）
というのは流石に酷い気もするので一つずつ読み解いていく

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/0c9bd015-d334-787a-e2cc-ce55486a9830.png">

そもそもSteamVRは入力ソースをユーザーが調整できる、弾を発射するという操作をジャンプする操作と入れ替えることも可能であり、これらはクリエイター側が何か特別な事をする必要はない
バインドにはテンプレートを用意でき
|default|platformer|buggy|mixedeailt|
|:-:|:-:|:-:|:-:|
|一般的なバインド|プラットフォーマー向け(マリオのようなゲーム)|乗り物の操作に適したバインド|よりリアルな体験向き

といった特徴があると思われる、これらはクリエイター側が最初に設定しておいて、ユーザー側が適時変えていくものである。

![スクリーンショット 2024-09-19 143223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802772/618d4adb-6eb0-99b6-30d7-05969866a3e4.png)
適当にIntaractUIを選択すると色々な項目が出てくる

- Name(名前)
- Type(型)
 
|名前| Boolean | vector1 | vector2 | vector3 | pose | skelton |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|用途(例)|ボタン|ジョイスティック|ジョイスティック|ジョイスティック|コントローラの座標など|難しい奴|

-Required(必要性)
| Optional | suggested | mandatory |
|:-:|:-:|:-:|
|任意|推奨|強制|

これらの値を設定してやる必要がある。
(Localizeは流石に説明しなくてもいいでしょ...)

まとめ
SteamVR InputManagerでは値を任意に定義できる。
とりあえずはこういうのがあるよ～って覚えておけばおけ。

## とりあえず休憩
実際に作っている時は、ドキュメント流し読みの逐次実装していて、しっかりとした理解をしていなかったため、纏めるために再確認してると思ったよりも意外な情報が出てくる、面白い。

ということで準備編はおしまいです、次は実際にプログラムを組んだりして、モノを掴んで動かせるようにします。