【Unity】加速度センサーでスマホを傾けた際の処理を作れる!

スマホの加速度センサー Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityでスマホの加速度センサーを検知したい!」

「スマホを傾けた際の処理を作りたい!」

というお悩みの方に向けた内容となっています。

Unityでは、スマホ向けのゲームを作ることができ、スマホを傾けるとゲームが動くといった処理も作ることができます。

スマホには、加速度センサーというスマホの動きや傾きを検知しているセンサーがあり、このセンサーの反応をUnityで取得することができます。

加速度センサーの動きは、Unity上のInputクラスにある「acceleration」という変数で受け取ることができます。

そこでこのページでは、Unityでスマホ向けのゲームを制作する際に、スマホの傾きを使ったゲーム内の処理を行う場合の作り方についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

スマホの加速度センサーとは?

まずは、スマホの傾きを検知している加速度センサーがどういうものなのか、またUnityでその加速度センサーをどのように取得するのかを紹介していきます。

スマホの動きや傾きを検知しているセンサー

スマホの加速度センサーとは、冒頭でも紹介しましたが、スマホの中で傾きや動きを検知しているシステムです。

例えば、スマホを横向きに持つと画面が横向きに切り替わったり、スマホを持ちながら歩くと歩数を計測してくれたりする機能には、加速度センサーが使われています。

この加速度センサーを詳しく説明すると、基本的にAndroidなら電源ボタンを右、iPhoneなら電源ボタンがある面を表にして持った場合の横方向をX軸、縦方向をY軸、手前(奥)方向をZ軸として、それぞれの3つの軸に対して、スマホにかかる重力の大きさ(重力加速度)を計測しています。

そして、この加速度センサーの値を元に、スマホの左右や上下の傾きを検知することができています。

UnityではInput.accelerationで値を取得できる

Unityでは、この加速度センサーの値をInput.accelerationで取得することができます。

このInput.accelerationは、入力などで使うInputクラスで管理されている変数で、スマホの加速度センサーの値をVector3型で保持していて、スマホの傾ける方向に合わせてx・y・zのそれぞれの変数で値を取得しています。

例えば、スマホのX軸方向を傾けた場合は、acceleration.xの値が変化することになり、スマホの右方向として、「-1.0」から「1.0」までで重力の大きさを取得できます。

また、スマホのY軸方向を傾けた場合は、acceleration.yの値が変化し、スマホの上方向として、「-1.0」から「1.0」までで重力の大きさを取得します。

同様に、スマホのZ軸方向を傾けた場合は、acceleration.zの値が変化し、スマホの手前方向として、「-1.0」から「1.0」までで重力の大きさを取得します。

これらのaccelerationの値を使うことで、スマホを傾けた際の処理を作ることができるようになります。

加速度センサーを使った処理の作り方

ここからは、実際に加速度センサーを使ってUnityのゲーム内で処理を作る作り方を紹介していきます。

スマホを横に傾けた際の処理

スマホを横方向に傾けた際の処理を作る場合は、スマホの加速度センサーのX軸の値である「Input.acceleration.x」を使います。

ここでは、スマホを横に傾けたときにボールを転がす処理を作ってみます。

上記のように、ゲームシーンに床とボールを配置して、ボールにRigidbodyを付けてスマホを傾けた時に、AddForceメソッドで力を加えるようにしていきます。

なお、左右の端はボールが落ちないように、壁を作っています。

using UnityEngine;

public class BallController : MonoBehaviour
{
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();   // Rigidbodyコンポーネントを取得する
    }

    void FixedUpdate()
    {
        if (Input.acceleration.x > 0.2 || Input.acceleration.x < -0.2)
        {
            rb.AddForce(new Vector3(4.0f * Input.acceleration.x, 0, 0));    // X軸方向にボールに力を加える
        }
    }
}

14行目で横方向の傾きであるacceleration.xの値が0.2よりも大きく-0.2よりも小さいときに、力を加えるようにif文で制御を行っています。

そして、16行目でAddForceメソッドを使って、X軸方向にacceleration.xに4.0を掛けた値の力を加えています。

実際に、スマホの実機で試してみると、

スマホを傾けると、その方向にボールが転がっているのが分かります。

なお、ゲーム画面の左上の部分には、参考にaccelerationのそれぞれの値をリアルタイムで表示させるようにしています。

スマホの上下を反対にした際の処理

スマホを回転させて上下を反対にした際の処理を作る場合は、スマホの加速度センサーのY軸の値である「Input.acceleration.y」が活用できます。

ここでは、スマホを上下反対にすると、オブジェクトの重力が反対にかかるような処理を作ってみます。

上記のように、シーン内の上下に床を設置して、真ん中にRigidbodyを付けたボールを配置しておきます。

なお、重力の大きさを決めるのは、RigidbodyにあるGravity Scaleのプロパティで、この値をスクリプトを使って変動させていきます。

using UnityEngine;

public class BallController2 : MonoBehaviour
{
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();   // Rigidbodyコンポーネントを取得する
    }

    void Update()
    {
        if (Input.acceleration.y < -0.7 && rb.gravityScale != 1)
        {
            rb.gravityScale = 1;    // ゲームの上から下に重力がかかるようにする
        }
        else if (Input.acceleration.y > 0.7 && rb.gravityScale != -1)
        {
            rb.gravityScale = -1;   // ゲームの下から上に重力がかかるようにする
        }
    }
}

14行目から17行目でacceleration.yの値が-0.7より小さいとき、gravityScaleの値を1にしてオブジェクトに通常の重力を与えています。

そして、18行目から21行目でacceleration.yの値が0.7より大きいとき、gravityScaleの値を-1にして重力を反対にして与えています。

実機で確認してみると、

スマホを通常で持った場合は下に重力がかかりますが、上下を反対にして持った場合、ゲーム内で上に重力がかかることになり、ボールが移動しているのが分かります。

スマホを手前や奥に傾けた際の処理

スマホを手前方向や奥方向に傾けた際の処理を作る場合は、スマホの加速度センサーのZ軸の値である「Input.acceleration.z」が活用できます。

ここでは、スマホを手前に傾けるとボールが下に動き、奥に傾けるとボールが上に動くという処理を作ってみます。

先ほどと同様に、ゲームの上下に床を配置して、真ん中にRigidbodyを付けたボールを置いて、Gravity Scaleの値を0にして重力を発生させないようにします。

ボールの動きは、スマホの傾きに合わせて上下にAddForceメソッドで力を加えるように作っていきます。

using UnityEngine;

public class BallController3 : MonoBehaviour
{
    Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();   // Rigidbodyコンポーネントを取得する
    }

    void FixedUpdate()
    {
        if (Input.acceleration.z < -0.6)
        {
            rb.AddForce(new Vector3(0, -2.0f * Input.acceleration.z, 0));   // Y軸に正の力を加える
        }
        else if (Input.acceleration.z > -0.5 && Input.acceleration.z < 0.5)
        {
            rb.AddForce(new Vector3(0, -1.8f + -Input.acceleration.z, 0));  // Y軸に負の力を加える
        }
    }
}

14行目から17行目でスマホを奥に傾けた際の処理として、acceleration.zが-0.6より小さい時に、AddForceメソッドでY軸に対して+方向に加わる力を計算しています。

また、18行目から21行目でスマホを手前に傾けた際の処理として、acceleration.zが-0.5より大きく0.5より小さい時に、AddForceメソッドでY軸に対して-方向に加わる力を計算しています。

実際に動かしてみると、

上記のように、スマホを手前方向や奥方向に倒すことで、ボールが動く処理を作れています。

まとめ

このページでは、Unityでスマホの加速度センサーを使った処理の作り方についてまとめていきましたが、いかがでしたでしょうか?

スマホの加速度センサーとは、スマホの傾きを検知しているセンサーで、スマホの左右・上下・手前(奥)といった傾きを重力によって判定しています。

Unityでは、この加速度センサーの重力値を「Input.acceleration」という変数で取得することができ、スマホの傾きに合わせたゲーム内の処理を作ることができます。

スマホの傾きの処理は、少しややこしい部分もありますが、Input.accelerationのx・y・zを組み合わせることで、様々な動きを作ることができます。

最後までお読みいただきまして、ありがとうございました!

コメント