<2018/5/31 VRGOの記事から移動>

Oculus Goを被って、自分で作った世界を見回せる様になったら、やりたくなるのが移動です。
Goには専用のコントローラがあるので、これを使わない手はありません。

前回インストールしたOculus Utilityには、OVRPlayerControllerというPrefabが入っています。
このPrefabにはCharacter Controllerがアタッチされているので、そのまま使えるはず!とGoのコントローラ片手にやってみたのですが、、、。なぜかうまく動きません。タッチパッドを触っても、ピクっとしか動かない、、、。
ソースコードを覗いてみましたが、イベントの取得方法すら分からないので、まずはググってみました。
すると、こちらのページ(トマシープが学ぶ:Oculus Go開発【コントローラー表示、クリック反応、移動、ポインタ】)でSDK使わずに動かしてました!
さらに、「タッチパッドで移動」に書かれていたコードを使わせてもらったところ、無事にカメラを動かせました。
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()の以下をいじりました。
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が何かにぶつかる座標が分かるので、それを使って弾などを発射できるようになります。
移動できると楽しくなってきますね。ゲームが作りたくなってきます。
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で回転してくれました。