今回はOculus Questの開発ネタをやっていきます。
Oculus QuestをALVRで起動した時にAvatarGrabシーンで手が出ない問題を解決します。
OculusQuestのバージョンアップでALVR関係なく手がでないことが起こりますが、そちらも解決します。
- 開発環境
- ALVRとは
- Oculus Questのバージョンアップデート
- 追記、Oculus Integration 1.40の場合
- 前提条件
- 主要コンポーネント
- サンプルシーンの確認
- Hand
- Handの修正
- Handの手動追加
- シーン再生時にTime.timeScaleが0になる
- 【8月9日追記】時間が止まる問題への対策
- まとめ
開発環境
Windows 10
Unity 2018.4.5f
Oculus Integration ver1.39
Oculus Quest
ALVR
ALVRとは
こちらで少し触れています。
簡単に言うと、PC向けVRの映像をOculusQuestなどスタンドアロン型HMDに転送するソフトウェアです。
これにより、毎回ビルドしなければならないQuestの動作テストをEditor上ですぐに動作させることができます。
Oculus Questのバージョンアップデート
7月下旬にOculusQuestがアップデートされました。
この時、同時に少し不具合が起きています。これらの不具合はALVR関係なく起こります。
まずはこちらの手段をお試しください。
・コントローラーが片方したトラッキングされない!
・AvatarGrabシーンでクラッシュする!
といった問題は以下のQiitaを参考にしてみてください・
追記、Oculus Integration 1.40の場合
Oculus Integrationのバージョンによって微妙に解決方法が異なりますが1.40の場合、マニフェストの編集で解決します。
なお、Build And Run を実行したときに
DeploymentOperationFailedException: No activity in the manifest with action MAIN and category LAUNCHER. Try launching the application manually on the device. UnityException: Could not find any valid targets to launch on for Android
というエラーが出る場合は、生成された AndroidManifest.xml の
<category android:name="android.intent.category.INFO"/>
のところに
<category android:name="android.intent.category.LAUNCHER"/>
を書き足すととりあえず上手くいくようです。
詳しくはこちらをどうぞ。
前提条件
OculusIntegrationを使用しており、ALVRで動作確認をしようとしたところ手が表示されない状態であること
Androidビルドなら表示されていること。
主要コンポーネント
Hand
ハンドというのはかなり大雑把な名前ですが、手のアニメーションや描画、当たり判定の切り替えを担当するコンポーネントです。
サンプルシーンの確認
Assets/SampleFramework/Usageに様々なサンプルシーンがあります。
学習や挙動の確認にとても有益です。見てみましょう。
実は正常に表示されるシーンがあります、それはCustomHandsシーンとDistanceGrabシーンです。
この2つのシーンではGrabberにOVR GrabberやDistanceGrabberコンポーネントがアタッチされていますが、
Handコンポーネントもアタッチされていることを確認しましょう。
このHandコンポーネントはAvatarGrabシーンではアタッチされていません。
当然、プレハブ化されているAvatarGrabberやLocalAvatarWithGrabも同様です。
Hand
インスペクターパラメーター
Controller
手のタイプ、右手なら「R Touch」、左手なら「L Touch」にするとよい
Animator
子オブジェクトにある手のモデルのAnimator
Default Grab Pose
Handの修正
手が非表示になる時、Hand.csを編集するだけで解決することがあります。
できた。Quest開発でいちいちビルドしないための開発効率化の試行、ALVRとUnityEditorの連携。以下詰まりポイント
— イシヤマ@xR (@IshiyamaTokina) June 4, 2019
・PlatformはAndroidじゃなくPC向け
・XR SettingsにOpenVR追加
・手がなぜか消える。HandスクリプトのOnInputFocusLostメソッドのrenderers[i].enabledをコメントアウト#OculusQuest pic.twitter.com/ROP85zAIdx
Hand.csのOnInputFocusLostメソッドを以下のようにします。
renderers[i].enabled部分をコメントアウトします。
Handの手動追加
上記でHand.csを修正しても手が表示されない時はHandを手動で追加します。
コンポーネントのアタッチ
まず、両手のAvatarGrabberにHandコンポーネントをアタッチします。
そしたら、HandのControllerを修正します。右手ならR Touch、左手ならL Touchにします。
この値はOVR GrabberのControllerと同じ値にするといいでしょう。
手のモデル
Assets/Oculus/SampleFramework/CostomHands/Modelsの中にある、
「l_hand_skeletal_lowres」と「r_hand_skeletal_lowres」を
Handコンポーネントががアタッチされているオブジェクトの子オブジェクトにします。
AnimatorControllerがnullなので、右手左手に応じたAnimatorをアタッチします。
パラメータの設定
先ほど子オブジェクトにした手のモデルを、HandをコンポーネントのAnimatorに設定します。
最後に、Default Grab PoseにAssets/Oculus/SampleFramework/CostomHands/Modelsの中にある、
HandPoseDefaultPfプレハブを設定します。
これでHandの設定は終了です。
うまくいけば、無事手が表示されていると思います。
うまくいかなかった場合は↓
シーン再生時にTime.timeScaleが0になる
スタンド攻撃を受けている
調べても同じ報告が出てこないので私の環境だけかもしれませんが、
シーン開始時にtimeScaleが自動的に0になる場合があります。
そもそもシーン開始時に手が動いていない場合はこの可能性を疑いましょう。
この状態になると視点移動はできますが手が動かず、物理演算も止まります。
Update()の中でDebug.Log(Time.timeScale);を呼び出すと、毎フレーム0が呼ばれます。
シーン開始時にtimeScaleが0になるようなら以下のスクリプトを適当なオブジェクトにアタッチしましょう。
【8月9日追記】時間が止まる問題への対策
この問題について解決策を教えていただきました。
どうやらシーン内で悪さをしているコンポーネントがいるようです。
timeScaleが0になる問題について、もしかしたらAvatarGrabシーンのEnvironment/DynamicにアタッチされているPauseOnInputLoss.csが原因かもしれません
— KOGA Mitsuhiro (@shiena) August 8, 2019
シーン内にある、DynamicにPauseOnInputLossコンポーネントがアタッチされています。
このコンポーネントは、OVRManagerのInputFocusLostにイベントハンドラを登録しています。
InputFocusLostは入力が失われた時に呼ばれるイベント変数で、初回Update時に実行されているようです。
コンソールで"[OVRManager] InputFocusLost event"が出ている場合、この可能性が大!
解決方法としては、シンプルにPauseOnInputLossを無効化するといいでしょう。
この現象はOculusQuestがアップデートされる前から稀にあったのでとても助かりました。
@shienaさんありがとうございます。
まとめ
・手が表示されない場合、Hand.csを編集してみる
・それでもだめなら、Handを直接追加してみる
・それでもだめなら時間が止まっていないか確かめる
他間違っている箇所、わかりにくい点がありましたらコメントにお願いします。