<2018/5/31 VRGOの記事から移動>
Oculus Goを被って、自分で作った世界を見回せる様になったら、やりたくなるのが移動です。
Goには専用のコントローラがあるので、これを使わない手はありません。
前回インストールしたOculus Utilityには、OVRPlayerControllerというPrefabが入っています。
このPrefabにはCharacter Controllerがアタッチされているので、そのまま使えるはず!とGoのコントローラ片手にやってみたのですが、、、。なぜかうまく動きません。タッチパッドを触っても、ピクっとしか動かない、、、。
ソースコードを覗いてみましたが、イベントの取得方法すら分からないので、まずはググってみました。
すると、こちらのページ(トマシープが学ぶ:Oculus Go開発【コントローラー表示、クリック反応、移動、ポインタ】)でSDK使わずに動かしてました!
さらに、「タッチパッドで移動」に書かれていたコードを使わせてもらったところ、無事にカメラを動かせました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Vector2 pt = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); ///タッチパッドの位置 if (pt.x < -0.5 && -0.5 < pt.y && pt.y < 0.5)///左側? { player.transform.localPosition += new Vector3(-0.05f, 0, 0); } if (pt.x > 0.5 && -0.5 < pt.y && pt.y < 0.5)///右側? { player.transform.localPosition += new Vector3(0.05f, 0, 0); } if (pt.y < -0.5 && -0.5 < pt.x && pt.x < 0.5)///下側? { player.transform.localPosition += new Vector3(0, 0, -0.05f); } if (pt.y > 0.5 && -0.5<pt.x && pt.x<0.5)///上側? { player.transform.localPosition += new Vector3(0, 0, 0.05f); } |
元ネタの方は、0 * Time.deltaTimeとなっていて、書かれていた通り動きがおかしかったので、潔く移動距離だけ残してみたところ意図した通りに動きました。
ただ、カメラを回転しても移動する向きが変わらないので、以下のような状態になってしまいました。
最終的には、OVRPlayerControllerにアタッチされた、OVRPlayerController.csに先ほど分かったタッチパッドの取得方法を上書きして、移動と向きの回転ができるようになりました。
ソースコードでは、UpdateMovement()の以下をいじりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public virtual void UpdateMovement() { if (HaltUpdateMovement) return; if (EnableLinearMovement) { bool moveForward = false; bool moveLeft =false; bool moveRight = false; bool moveBack =false; Vector2 pt = OVRInput.Get(OVRInput.Axis2D.PrimaryTouchpad); ///タッチパッドの位置 if (pt.x < -0.5){//left moveLeft =true; } if (pt.x > 0.5){//right moveRight =true; } if (pt.y < -0.5){//back moveBack =true; } if (pt.y > 0.5){//forward moveForward = true; } } |
OVRPlayerControllerのinspectorで、accelerationが0.1だと移動が遅すぎなので、0.5とか適宜調整した方がよさそうです。
Rayが飛ばせるコードが分かると、Rayが何かにぶつかる座標が分かるので、それを使って弾などを発射できるようになります。
移動できると楽しくなってきますね。ゲームが作りたくなってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if (OVRInput.GetDown(OVRInput.Button.PrimaryIndexTrigger)){ //トリガー引く Fire();//例えば } if (OVRInput.GetDown(OVRInput.Button.Back)){ //戻るボタン押す Throw();//例えば } if (OVRInput.GetDown(OVRInput.Button.PrimaryTouchpad)){ //タッチパッド押しこむ Hide();//例えば } if (OVRInput.GetDown(OVRInput.Touch.PrimaryTouchpad)){ //タッチパッド触る ReadyToPress();//例えば } |
上記のような方法で、トリガーやその他のボタンイベントを取得できるそうです。
ちなみに、コントローラのprefabは、OVRCameraRig下にあるRightHandAnchor(またはLeftHandAnchor)のchildとしてTrackedRemoteプレハブを入れると、持ち手に反映されました。
Oculus Goのコントローラモデルは、TrackedRemoteプレハブの中あります。自前の武器なんかはGoのコントローラと同じ様にぶらさげると、3DoFで回転してくれました。