この記事でのバージョン
Unity 2017.4.17f1
Steam VR Plugin 2.0.1
はじめに
今回はUnityでVIVE(Steam)向けのゲームを開発する際の最初の一歩的な感じの記事です!
なお、Oculus Goでも似たような記事書いていました。
Steam VR Plugin
UnityでVIVE向けのアプリを開発する際は、まずSteam VR Pluginをインストールします。
(使わなくても開発は出来るっぽいですが、無料でかなり開発が楽になるので基本的に使った方が良い)
SteamVR Plugin - Asset Store |
なお、現状2018.3以降はUnity Asset Storeにあるやつは対応してないらしいので、
2018.3以降を使ってる人はGitHubにある対応版を使いましょう。
Steam VR Pluginをプロジェクトにインストールすると
「この設定はこう変えた方が良いよ!」みたいなウィンドウが表示されます。
基本的にはAccept Allで全てオススメの設定にしちゃって大丈夫です。
初期設定
Steam VR Pluginのインストール後、ちょっと初期設定というか準備が必要になります。
そのためにSteamVRディレクトリ内にあるSimple Sampleというシーンを開き、実行します。
ちなみに、SteamVRが起動してないとシーン実行時にエラーが出るので、
予めSteamVRを起動しておき、VIVEやコントローラーも使える状態にしておきましょう。
SteamVRを起動した状態でシーンを実行すると、初回は(というよりInputの設定がない時は)
以下のようなウィンドウが表示されるので、Yesを押します。
するとシーンの再生が停止され、新たに以下のようなウィンドウが表示されます。
特に理由がなければなにも変更せずにSave and generateを押すだけでOK。
これでInput関連で必要なファイルが生成されます。
ちなみに、さきほどのウィンドウはWindow -> SteamVR Inputから開く事も出来ます。
また、シーン起動時には以下のようなウィンドウも表示されるので、Yesを押します。
すると、アクション関連(?)に必要なjsonが生成されます。
実行
とりあえず設定はここまで完了です。
あとはシーンを実行すれば、接続されているVIVEに映像が表示されているはずです。
(GameViewにもVIVEと同じ映像が表示)
また、コントローラーやカメラ(VIVE)の位置も同期されています。
Simple Sampleでは特に何も出来ませんが
InteractionSystem/SamplesにあるInteractions_Exampleというシーンでは
色々な動作を試せますし、実装のヒントにもなりそうです。
なお、他のシーンをVR化したい場合は
元からあるCameraを消して、Prefabsに入ってるにあるCameraRigというPrefabを置くだけでOK。
(最初からシーンに置かずに、プログラムからロードしてもOK)
Hand-painted Island Pack | 3D Fantasy | Unity Asset Store |
このCameraRigはSteamVRが起動してないと、エラーが出て動かないので、
SteamVRが使えない環境(Macとか)でも開発したい場合は、
CameraRigをロードせずに普通のカメラをロードするみたいな処理が必要になります。
(SteamVRが起動してるかの判定は分からなかったので、ご存知の方は御一報頂ければ幸いです)
入力
最後に軽くコントローラーの入力についても紹介しておきます。
と言っても、CameraRigをシーンに設置しておけば以下のような感じで簡単に入力を取得出来ます。
private void Update() { if (SteamVR_Input._default.inActions.GrabGrip.GetStateUp(SteamVR_Input_Sources.Any)) { Debug.Log("グリップを離した"); } if (SteamVR_Input._default.inActions.GrabGrip.GetStateDown(SteamVR_Input_Sources.Any)) { Debug.Log("グリップを押した"); } if (SteamVR_Input._default.inActions.GrabGrip.GetState(SteamVR_Input_Sources.Any)) { Debug.Log("グリップを押している"); } else { Debug.Log("グリップを離している"); } }
ちょっと長いので分かりづらいかもしれませんが、簡単に書くと以下のような形式になります。
//_defaultやinActionsは初期設定時に生成されたクラス
SteamVR_Input._default.inActions.入力の種類.入力の条件(デバイスの種類)
例えば入力の種類はGrapGrip(コントローラー横のグリップボタン)、
入力の条件はGetStateUp(ボタンを離した瞬間)、
デバイスの種類はSteamVR_Input_Sources.Any(左右どちらかのコントローラー)の場合は
//左右どちらかのコントローラーのグリップボタンを離した瞬間か if (SteamVR_Input._default.inActions.GrabGrip.GetStateUp(SteamVR_Input_Sources.Any)) { Debug.Log("グリップを離した"); }
となります。
おわりに
予想より簡単にVIVE実機で動いたので驚きましたが、
ここはさすがのUnity&Steamと言った所でしょうか。
なお、実際にSteamでリリースする時は他にも設定とかが必要になりそうなので、
その際はまた改めて記事にすると思います。
------------追記------------
Hmd Not Found Presence Failedというエラーが出る時の対処法を書きました!
XR: OpenVR Error! OpenVR failed initialization with error code VRInitError_Init_HmdNotFoundPresenceFailed: "Hmd Not Found Presence Failed (126)"!
------------追記おわり------------
参考