回転の操作

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

スクリプト

まず、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);                      // 減衰の時間
}

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


Revision #2
Created 2026-07-29 01:40:05 UTC by Menendez Francisco
Updated 2026-07-29 04:29:31 UTC by Menendez Francisco