VRレーシングゲーム用ジャイロセンサで操作するプレイヤーを作成する


[この記事](http://qiita.com/fumishitan/items/2b60f27b79fdb4772be4)の第4回目の記事です。

今回はVRレーシングゲーム用のジャイロセンサで操作するプレイヤーを作成します。
本日行うことは以下
・プレイヤーオブジェクトの作成
・ジャイロセンサ操作ロジックの作成
・シュミレーター上で操作する
・ゴール到着時のロジックを作成する

## プレイヤーオブジェクトの作成

まず、プレイヤーオブジェクトを作る
今回プレイヤーオブジェクトは透明でいいと考えているのでとりあえず

GameObject > 3DObeject >Cube

でオブジェクトを作りRunnerとリネームする
そのご下記のようなコンポーネント追加と設定を行う

![スクリーンショット 2015-07-09 16.51.40.png](https://qiita-image-store.s3.amazonaws.com/0/55227/74541ebe-e74e-a045-d33d-d10e933bd905.png)


## ジャイロセンサ操作ロジックの作成

今度はジャイロセンサでゲームオブジェクトを操作するロジックを作成します。
今回のゲームではz軸方向に進みx軸方向によけながら障害物を避けることを想定しているので
ジャイロセンサの値に合わせてx軸に動く様にします。

そのコードが以下のようになります。

```C#
Quaternion gyro = Input.gyro.attitude;
Quaternion action_gyro = Quaternion.Euler (90, 0, 0) * (new Quaternion (-gyro.x, -gyro.y, gyro.z, gyro.w));
Vector3 p = new Vector3 (action_gyro.x, 0, Speed);
transform.position += p;
```

ちなみにジャイロで操作しているのは下記の部分

```C#
Vector3 p = new Vector3 (action_gyro.x, 0, Speed);
```
action_gyro.xでgyroの値をx軸方向の操作に利用しています。

Speedに定速を指定し、進めるようにしています。

## シュミレーター上で操作する

ここで若干蛇足だが現在のものだとジャイロがないと動かないので、そうでなくとも動く十字キーだけで動くプログラムを作成する

それが以下になる,

``` C#
if(Input.GetKey ("up")){
   Vector3 up = new Vector3 (transform.position.x, transform.position.y, transform.position.z + Speed);
   transform.position = up;
}
                
if(Input.GetKey ("down")){
   Vector3 down = new Vector3 (transform.position.x, transform.position.y, transform.position.z - Speed);
   transform.position = down;
}
                
if(Input.GetKey ("right")){
 Vector3 right = new Vector3 (transform.position.x +Speed, transform.position.y, transform.position.z);
 transform.position = right;
}
                
if(Input.GetKey ("left")){
Vector3 left = new Vector3 (transform.position.x - Speed, transform.position.y, transform.position.z);
transform.position = left;
}
```

## ゴール到着時のロジックを作成する

ゴール時の到着のロジックは大きく分けて、二つ作る
1.ゴールについたことを検知し書くプレーヤーにアタッチされているスクリプトのonGoalメソッドを動かす
2.ゴールに到着したらそれ以上の移動を抑える

1については新しいスクリプトを作成しコーディングするそうなると以下のようなものができる

``` C#:CollisionDetect.cs

using UnityEngine;
using System.Collections;

public class CollisionDetect : MonoBehaviour {
    public bool callbackActive = true;
    
    void OnTriggerStay (Collider col){
        if(callbackActive == false){
            return;
        }
        
        //Goalについたら書くスクリプトのOnGoalを作動させる
        if(col.name == "Goal"){
            gameObject.SendMessage("OnGoal");
            return;
        }
    }
    
    void OnDead() {
        callbackActive = false;
    }
    
    void OnGoal() {
        callbackActive = false;
    }
    
}

```

上記の

```
gameObject.SendMessage("OnGoal”);
```

で”OnGoal”というメソッドをだし、プレイヤーにアタッチされているOnGoalメソッドを動かすようにする

つぎに２のロジックについてはジャイロで操作するスクリプトの中に埋め込む、そのスクリプト全体が以下のようになる

```csharp:Runner.cs
using UnityEngine;
using System.Collections;

public class Runner : MonoBehaviour {
    private GUIStyle labelStyle;
    Quaternion gyro;
    bool goal = false;
    public float Speed = 0.3f;
    void Update () {
        if (goal == false) {
            Input.gyro.enabled = true;
            if (Input.gyro.enabled) {
                Quaternion gyro = Input.gyro.attitude;
                Quaternion action_gyro = Quaternion.Euler (90, 0, 0) * (new Quaternion (-gyro.x, -gyro.y, gyro.z, gyro.w));
                Vector3 p = new Vector3 (action_gyro.x, 0, Speed);
                transform.position += p;
            }else{
                //シュミレーター上で動かすための、キーボードの入力を受け付ける
                if(Input.GetKey ("up")){
                    Vector3 up = new Vector3 (transform.position.x, transform.position.y, transform.position.z + Speed);
                    transform.position = up;
                }
                
                if(Input.GetKey ("down")){
                    Vector3 down = new Vector3 (transform.position.x, transform.position.y, transform.position.z - Speed);
                    transform.position = down;
                }
                
                if(Input.GetKey ("right")){
                    Vector3 right = new Vector3 (transform.position.x +Speed, transform.position.y, transform.position.z);
                    transform.position = right;
                }
                
                if(Input.GetKey ("left")){
                    Vector3 left = new Vector3 (transform.position.x - Speed, transform.position.y, transform.position.z);
                    transform.position = left;
                }
                
            }
        } else {

            transform.position = new Vector3 (transform.position.x, transform.position.y, transform.position.z);
        }
    }

    void OnGoal() {
        goal = true;
    }
}
```

ということで本日作成したCollisionDetect.csとRunner.csをプレイヤーであるRunnerにアタッチすればジャイロでの操作が行えるプロジェクトとなる。