ミニゲームの入力
タップやらドラッグ処理などやらならあまり好みではないが入力系のアセットを購入する、もしくは自作出来る。
アセットの購入が好みではないのは、どうせシビアな入力をしないといけない場合は自分で色々実装しないといけない。あとで苦労するか今苦労するかの違いだが、入力周りは経験上開発終盤になって変ええたりしやすい。
その際に自作のほうが楽に修正できる。
他人が作ったものはなぜそういう実装に至ったのかの深い理解をしてからでないと思わぬ落とし穴にハマってしまうからだ。
さて、今回のタイトル、DZ(DangerZone)(仮)は首振りだけで行いたいので入力は傾きを取得出来ればいい。
その方法を模索しよう。
傾きの取得
Cardboardも端末を横向きにしてスマホを使うわけだからやり方は統一したほうがいいだろう。
上記での傾きは、デバイスの線形加速度Input.accelerationで取得している。
また、Input.gyro.attitudeで姿勢を取得できるようだ。
そしてGoogleVR SDKも新しくなっており、そちらでも取得する方法があるようだ。
GvrHeadset.cs の TryGetRecenterTransform でも座標と回転角を返してくれるようだ。
というわけでどんな値が出るのか確かめてみよう。
UnityRemote5で実機チェックをしてみると…Gvr系のパラメータが取得できない。
うーん、VRモードじゃないと取得できないのかなということで試しにVRモードへスイッチするボタンを用意してみる。
すると以下のメッセージが流れる。
“`
Virtual Reality SDK Cardboard is not supported in Editor Play Mode. Please Build and run on a supported target device.
Will attempt to enable None instead.
“`
ぬわー!
実機ビルドしないと確認出来ないのか。IL2CPPでビルドするから確認が遅くなっちゃう。
時間もあるので今回いじるのは3DoF。もうひとつは6DoFと呼ばれるもの。
いらすとやさんの絵がわかりやすいので貼り付けると以下の感じ。
3DoF(Cardboard,Oculus Go,Gear VR など)
6DoF(Daydream,Oculus Rift,HTC Vive, など)
“`
3DoFは「ヘッドトラッキング」、6DoFは「ポジショントラッキング」
“`
と呼ぶらしい。
首だけ動かして遊びたい!なら3DoFで出来そうなのでVox+でよかった。
あとはうちの huawei nova lite2 の擬似ジャイロがどれだけ優秀かが心配…。
というわけでAndroidへ出力してVRスイッチしてみた結果、以下の問題が起きた。
- uGUI表示がおかしい!
- 勝手にヘッドトラックするから、いらすとやさんの3DoF画像でいう赤とオレンジの回転止めたい
- 開発面倒
VR面倒だなぁ。UIもいまのうちにVR用を作らんとな。
<h3>UGUIの表示をなおそう</h3>
タイトル文字かなにかが画面専有する図+左側の表示が切れておかしい。
試しにサンプルをビルドしてみると同じ状況になったのでこれは端末の問題かも。
Unity2018.3.3f1 + huawei nova lite 2 sample
UIは見れるようになった。
VR指定していると全てのカメラが回転の影響を受けるらしい。
というわけでタイトルのUICameraもMainCameraと同じ画角などにしておいて
上書き描画するようにしておいて、ゲーミング部分のUIは全て3Dで描画しといたほうがいいだろう。
<h3>ヘッドトラックはなんとかならんの</h3>
首の傾きだけでゲームしたいんすけど…と色々探していると”Designing for Google Cardboard“という項目を発見。
なるほど。確かに首を傾けるとカメラは動くけど上下左右の首振りは反映されない、というのは直感的ではないので酔いを引き起こしてしまう可能性がある。
では、3DoFの動きを受け入れつつデバイスを傾けることで入力できるように考えてみよう。
というわけで調べるのはあとにして次はジャイロ。
<h2>ジャイロの値</h2>
Landscapeモードにしておいて、Android機能の回転出来るようにしておいたところ、
LeftかRightかによって端末の向きは一緒なのに値は変わった。
テーブル上にスマホを左上の画像の状態で空があるほうに液晶が見えるよう置き、回転させたり傾きでLandscapeモードを切り替えて値をチェック。
(東京オリンピックの都市鉱山として今まで持っていた全てのスマホを寄付したので1台しか持ってないので回転させてチェック(笑))
上記の液晶内は緑が山で白が空。
液晶外は黒丸が二個ついてるほうが端末の上部、白丸があるほうが端末の下部。
左上と右下、右上と左下は端末の向きが違うとしても表示内容は一緒である。
このときのQuaternion値をチェックしてみる。
左上:0,0,0,-1
右上:0,0,1,0
左下:0,0,-1,0
右下:0,0,0,-1
ウーン…直感的ではない。
操作方法の肝になるので中途半端な知識で実装すると痛い目見そうなので
明日は更に調べてみよう。Unity上でXYZ軸を作って実際に回転かけてみるか。