# 回転の操作

スマホの方位に合わせて、マップ（ボールのグループ）を回転しましょう。

## スクリプト

まず、PCで確認できるため、キーボードの A と Dキーで回転しましょう。スクリプトはとても単純である：

```c#
// レーダーの回転を制御する
public class RotationController : MonoBehaviour
{
    // 現在の角度
    private float angle;

    private void Update()
    {
        // 回転速度（固定）
        const float rotationSpeed = 180f;
        
        // 水平入力（-1 ～ 1）
        float input = Input.GetAxis("Horizontal");
        
        // 角度を更新
        angle += rotationSpeed * Time.deltaTime * input;
        
        // Transformで回転（2Dゲームなので、Z軸周りの回転）
        transform.rotation = Quaternion.Euler(0, 0, angle);
    }
}
```

スクリプトを「MapRotation」にアタッチし、キーボードで確認してください。

## コンパス（方位センサー）を使用

つぎ、コンパスを使って、回転してみましょう。ただし、コンパスはスマホの時だ使用するので、実行中にスマホであるかどうかを確認しなければならない。Unityでは：

```c#
// モバイル（スマホ・タブレット）であるか？
Application.isMobilePlatform
```

で確認できる。なお、コンパスを使うには、まず有効にする必要があるので、以下の機能を使用：

```c#
// 有効化
Input.compass.enabled = true;

// 無効化
Input.compass.enabled = false;
```

そして、現在の向き（度単位）は：

```c#
// 方位（0度～360度の実数）
float value = Input.compass.trueHeading;
```

で取得できる。上記の機能を使い、以下のようにスクリプトを編集してください：

```c#
// レーダーの回転を制御する
public class RotationController : MonoBehaviour
{
    // 現在の角度
    private float angle;

    private void Start()
    {
        // スマホなのか？
        if (Application.isMobilePlatform)
        {
            // コンパスを有効化し、最初の角度を取得
            Input.compass.enabled = true;
            angle = Input.compass.trueHeading;
        }
    }
    
    private void Update()
    {
        // スマホなのか？
        if (Application.isMobilePlatform)
        {
            // コンパスから角度を取得
            angle = Input.compass.trueHeading;
        }
        
        // PCなのか？
        {
            // 回転速度（固定）
            const float rotationSpeed = 180f;

            // 水平入力（-1 ～ 1）
            float input = Input.GetAxis("Horizontal");

            // 角度を更新
            angle += rotationSpeed * Time.deltaTime * input;
        }
        
        // Transformで回転（2Dゲームなので、Z軸周りの回転）
        transform.rotation = Quaternion.Euler(0, 0, angle);
    }
}
```

ビルドし、実機で確認しましょう。

## 振動を減衰する

端末によるが、手の動きやセンサーの敏感により、`Input.compass.trueHeading` の出力が振れることがある。スムーズに回転するには、Unityは以下の機能がある：

```c#
// 回転の振動減衰
// current        ：現在の数値
// target         ：次にしたい数値
// currentVelocity：自動的に計算される速度。メンバー変数として作成してください
// smoothTime     ：減衰の時間。大きいほどスムーズになるが、遅れが発生する
Mathf.SmoothDampAngle(float current, float target, ref float currentVelocity, float smoothTime);
```

これ機能を使い、スクリプトを編集してください。まず、`currentVelocity` をメンバー変数として追加する。

```c#
// レーダーの回転を制御する
public class RotationController : MonoBehaviour
{
    // 現在の角度
    private float angle;

    // 振動減衰に必要なデータ
    private float currentVelocity;

    // (省略)
}
```

そして、Update では：

```c#
// スマホなのか？
if (Application.isMobilePlatform)
{
    // コンパスから角度を取得
    // angle = Input.compass.trueHeading;
    
    // 振動減衰
    angle = Mathf.SmoothDampAngle(
        angle,                      // 現在の角度 
        Input.compass.trueHeading,  // 次にしたい角度
        ref currentVelocity,        // 自動的に計算される速度
        0.1f);                      // 減衰の時間
}
```

ビルドし、実機で確認しましょう。