UnityでVRテンプレートを使った開発で調べたことなどのメモ。
UnityでVRテンプレートでMeta Quest 2
動作確認
毎回ヘッドセットにロードすると大変?なので、プロジェクト設定>XR Plugin ManagementのPCタブではチェックをはずしておく。確認したい場合は逆にチェック。
カメラ
サンプルシーンには必要なGUIがあるので、サンプルシーンを複製して使うのがよさそう。
カメラは「XRRIG>Camera Offset>Main Camera」にあります。
Main Cameraを選択後、「クリアフラグ」を「ソリッドカラー」にすれば背景が単色になります。
コントローラ
サンプルシーンにはすでにコントローラが割り当てられています。
シーンを実行すると、メタクエスト内でコントローラが見れます。
マテリアル・テクスチャ
マテリアルやテクスチャは通常通り使えます。
PostProcessingのBloomを使った発光も可能。これならビートセイバーっぽい感じにもなりそう。ただし多用するとパフォーマンスに影響しそうなので注意。
スクリプトでコントローラの取得
ざっくりいうとアセットの「Input System」でキー割り当ての設計図を作成。
入力を受ける「ゲームオブジェクト」からは「Player Input 」というコンポーネントをつかってその設計図を指定し、スクリプトにイベントのアクションを記述します。
Input SYstems
まず「アセット>作る>Input Systems」を実行。
ない場合はパッケージマネージャから「Input System」を先にインストールしておきましょう。
ではキーの割り当てを先に作りましょう。
作ったアセットをダブルクリックします。
「Action maps」で任意の名前をつけます。これは、場面場面でキー操作が切り替わってもいいように「キー割り当て」を複数作れるようにしたものです。
中央のAcitonsでは、コントローラの操作でどうゆうイベントが発生するかを記述します。
例えば「TRIGGER」と名をつけると、スクリプトからは「OnTRIGGER」関数で参照できます。
続けて「Add Binding」で具板的にどのキー操作のときに「TRIGGER」が発生するかを設定します。
(No Bindings)を選んだ状態で、Bindingsのプルダウンを開きます。
「XR Controller>Oculus Touch Controller>Oculus Touch Controller(Right hand)>Grip Pressed」と選択します。
これでコントローラの右グリップを押すと、「TRIGGER」が発生することになります。
上のSaveで明示的に保存するか、「Auto-save」をチェックして自動保存します。
ボタンの取得
今度は先に作ったキーの割り当てでオブジェクトのほうにイベント時の処理を記述しましょう。
キューブを作り、コンポーネントとして「Player Input」を追加。
そこで先ほどのInput SYstemsを指定します。
DefaultMapのところには「Action maps」のところに作った名前を指定します。
この段階で「OnTRIGGER」という名前が表示されていれば先ほど作ったデータが読み込まれていることが確認できます。
キューブに新規スクリプトを作成。
「OnTRIGGER」時の処理を追加します。
void OnTRIGGER()
{
Debug.Log("TRIGGER");
}
これでシーンを実行すると、オキュラスのほうで右コントローラのグリップを押すと「TRIGGER」というログが出力されるはずです。
重力を効かせて落下させるにはRigibodyをアタッチします。
void OnTRIGGER()
{
gameObject.AddComponent<Rigidbody>();
}
最初はオキュラスで表示できているのに反応がなくて困りました。
ただプロジェクト設定で、PCの場合に「Oculus」にチェックをいれたら無事反応するようになりました。
動かない場合はこちらを確認してみてください。
スティックの取得
コントローラの左右スティックの値をとるには、Actionsで「RSTICK」などの名前を作成。アクション設定でTypeを「値」、Cotnrolタイプを「Vector2」とします。
Bindingでは「XRContoller>Oculus Touch Cotnroller>Oculus Touch Cotnroller(Right)>Thumstick」を選択。
受け取る物体のほうではスクリプトで
using UnityEngine.InputSystem;
を宣言。
あとはログに出力するようスクリプトを組んで、実際スティックを動かすとどのような数値がでるかチェックしてみましょう。
void OnRSTICK(InputValue input)
{
Debug.Log("R" + input.Get<Vector2>().ToString());
}
左右スティックとも-1から1の間の数値を返します。
左:Xが-1、右:Xが1
上:Yが1、下:Yが-1
Bloomのやり方ついては以下で紹介。
本ブログのUnity関連記事一覧はこちら。