(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

UnityでVIVE(Steam)向けアプリを開発する際の手始め【Unity】【Steam】【VR】【VIVE】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2017.4.17f1
Steam VR Plugin 2.0.1


はじめに

今回はUnityでVIVE(Steam)向けのゲームを開発する際の最初の一歩的な感じの記事です!


f:id:kan_kikuchi:20190114181924g:plain:w800


なお、Oculus Goでも似たような記事書いていました。





Steam VR Plugin

UnityでVIVE向けのアプリを開発する際は、まずSteam VR Pluginをインストールします。

(使わなくても開発は出来るっぽいですが、無料でかなり開発が楽になるので基本的に使った方が良い)



なお、現状2018.3以降はUnity Asset Storeにあるやつは対応してないらしいので、

2018.3以降を使ってる人はGitHubにある対応版を使いましょう。


f:id:kan_kikuchi:20190114165042j:plain


Steam VR Pluginをプロジェクトにインストールすると

「この設定はこう変えた方が良いよ!」みたいなウィンドウが表示されます。

基本的にはAccept Allで全てオススメの設定にしちゃって大丈夫です。


f:id:kan_kikuchi:20190107190531j:plain


初期設定

Steam VR Pluginのインストール後、ちょっと初期設定というか準備が必要になります。

そのためにSteamVRディレクトリ内にあるSimple Sampleというシーンを開き、実行します。


f:id:kan_kikuchi:20190113165832j:plain


ちなみに、SteamVRが起動してないとシーン実行時にエラーが出るので、

予めSteamVRを起動しておき、VIVEやコントローラーも使える状態にしておきましょう。

f:id:kan_kikuchi:20190113170244j:plain


SteamVRを起動した状態でシーンを実行すると、初回は(というよりInputの設定がない時は)

以下のようなウィンドウが表示されるので、Yesを押します。


f:id:kan_kikuchi:20190113170923j:plain


するとシーンの再生が停止され、新たに以下のようなウィンドウが表示されます。

特に理由がなければなにも変更せずにSave and generateを押すだけでOK。


f:id:kan_kikuchi:20190113175148j:plain


これでInput関連で必要なファイルが生成されます。


f:id:kan_kikuchi:20190113175301j:plain


ちなみに、さきほどのウィンドウはWindow -> SteamVR Inputから開く事も出来ます。


f:id:kan_kikuchi:20190113175237j:plain


また、シーン起動時には以下のようなウィンドウも表示されるので、Yesを押します。


f:id:kan_kikuchi:20190113174910j:plain


すると、アクション関連(?)に必要なjsonが生成されます。


f:id:kan_kikuchi:20190113175256j:plain


実行

とりあえず設定はここまで完了です。

あとはシーンを実行すれば、接続されているVIVEに映像が表示されているはずです。

(GameViewにもVIVEと同じ映像が表示)


f:id:kan_kikuchi:20190113180719j:plain


また、コントローラーやカメラ(VIVE)の位置も同期されています。


f:id:kan_kikuchi:20190113180705j:plain


Simple Sampleでは特に何も出来ませんが

InteractionSystem/SamplesにあるInteractions_Exampleというシーンでは

色々な動作を試せますし、実装のヒントにもなりそうです。


f:id:kan_kikuchi:20190113181553j:plain
f:id:kan_kikuchi:20190114181924g:plain:w800


なお、他のシーンをVR化したい場合は

元からあるCameraを消して、Prefabsに入ってるにあるCameraRigというPrefabを置くだけでOK。

(最初からシーンに置かずに、プログラムからロードしてもOK)


f:id:kan_kikuchi:20190113194414j:plain


この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("グリップを離している");
  }

}

f:id:kan_kikuchi:20190114155925j:plain


ちょっと長いので分かりづらいかもしれませんが、簡単に書くと以下のような形式になります。

//_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でリリースする時は他にも設定とかが必要になりそうなので、

その際はまた改めて記事にすると思います。


参考