前回の記事(1)では、FPS風の縦横移動が少しの距離しかできませんでした。今回は、いろいろ試した結果、根本的解決に成功したので、経緯を記録しておこうと思います。
Oculusのスクロールを検知するために、前回記述していた内容は下記ようなものだったのですが、動く距離が少ないので、このhorizontalとverticalの値に掛け算を始めました。前回のコードは下記のようになっています。
private void GetInput(out float speed) { // Read input float horizontal = CrossPlatformInputManager.GetAxis("Mouse X"); float vertical = CrossPlatformInputManager.GetAxis("Mouse Y"); bool waswalking = _isWalking;
結果、一度に動く距離を延ばすことには成功したのですが、継続的に動かすことには失敗しました。どうやら、このhorizontalとverticalに代入すべき値は継続的に取得できないといけないようです。マウスのスクロールは一瞬なので、スクロールしている間しか動くことができません。一方、このスクリプトはキーボードを前提に作られているようで、ボタンを長押しして継続的に値が入ることが求められます。
そこで、一番都合がよいのはタッチパネルの座標を常に拾ってあげるということなのですが、それは前回失敗したところでした。それを今回、もう一度チャレンジしてみようと思いました。まずはダメだったやつを一応書いておきます。
///ダメだったやつ OVRInput.Update(); Vector2 _input = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad);
何がダメなのかよくわからないのですが、とりあえず、これはコントローラーに全く反応しませんでした。
そこで、一度Vector2を取得してからX方向とY方向に分解することを考えました。そこで、下記のように書き直してみました。
Vector2 primaryTouchpad = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); float horizontal = primaryTouchpad.x; float vertical = primaryTouchpad.y; _input = new Vector2(horizontal, vertical);//原文
すると、何故かこちらは上手く動いてくれて、コントローラーのタッチパネルの座標を見事に拾い、FPS風の縦横の動きができるようになりました。
最後に、タッチパネルを触ると発砲してしまうという現象が起きていたので、それを直しました。
//原文 //if (Input.GetButtonDown("Fire1") && !Input.GetKey(KeyCode.LeftShift)){ ...} //修正後 if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)) { muzzleFlash.Play(); GetComponent<AudioSource>().Play(); shooting = true; }
以前はマウスの左クリック等の”Fire1”か、キーボードの左シフトで発砲でしたが、修正後ではOculus Goのコントローラーのトリガーのみを検知するようにしたので、タッチパネルを触った時の誤発砲を防ぐことができました。
これで、Oculus GoでPhoton対戦FPSゲームをビルドし、コントローラーで動かして遊ぶことに成功しました。あとはUIですね。UIを見えるようにしてあげたいと思います。また、チャレンジして、結果をアップしたいと思います。