回転の操作
スマホの方位に合わせて、マップ(ボールのグループ)を回転しましょう。
スクリプト
まず、PCで確認できるため、キーボードの A と Dキーで回転しましょう。スクリプトはとても単純である:
// レーダーの回転を制御する
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では:
// モバイル(スマホ・タブレット)であるか?
Application.isMobilePlatform
で確認できる。なお、コンパスを使うには、まず有効にする必要があるので、以下の機能を使用:
// 有効化
Input.compass.enabled = true;
// 無効化
Input.compass.enabled = false;
そして、現在の向き(度単位)は:
// 方位(0度~360度の実数)
float value = Input.compass.trueHeading;
で取得できる。上記の機能を使い、以下のようにスクリプトを編集してください:
// レーダーの回転を制御する
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は以下の機能がある:
// 回転の振動減衰
// current :現在の数値
// target :次にしたい数値
// currentVelocity:自動的に計算される速度。メンバー変数として作成してください
// smoothTime :減衰の時間。大きいほどスムーズになるが、遅れが発生する
Mathf.SmoothDampAngle(float current, float target, ref float currentVelocity, float smoothTime);
これ機能を使い、スクリプトを編集してください。まず、currentVelocity をメンバー変数として追加する。
// レーダーの回転を制御する
public class RotationController : MonoBehaviour
{
// 現在の角度
private float angle;
// 振動減衰に必要なデータ
private float currentVelocity;
// (省略)
}
そして、Update では:
// スマホなのか?
if (Application.isMobilePlatform)
{
// コンパスから角度を取得
// angle = Input.compass.trueHeading;
// 振動減衰
angle = Mathf.SmoothDampAngle(
angle, // 現在の角度
Input.compass.trueHeading, // 次にしたい角度
ref currentVelocity, // 自動的に計算される速度
0.1f); // 減衰の時間
}
ビルドし、実機で確認しましょう。