こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「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を組み合わせることで、様々な動きを作ることができます。
最後までお読みいただきまして、ありがとうございました!
コメント