本記事について
スマホを車のハンドルのように回転させて遊びたい。
そこで、以下のようにスマホを回転させたときにどっち向きにどのくらい回転したのかを取得する方法を示す。
環境
環境
mac os 12.5 silicon
Unity 2021.3.7f1
Input System 1.3.0
iphone
GravitySensorについて
This is useful to control content by device orientation
ドキュメントより、スマホの傾きを取得したコンテンツを作れる
rotation values reported by sensors are rotated around the Z axis as follows
本記事で扱うアプリはホームボタンが右にくるように固定している。
そのためドキュメントより Values rotate by 270 degrees.
となる。
アプリの向きによってGravitySensorで取れる値は変わるはずなのでそこは注意。
GravitySensorの値の取得
まずはInput Systemをインストールする。 ドキュメント
設定方法等に特筆すべきことは特にないので本記事では書かない。(必要そうであれば後から追記)
using UnityEngine.InputSystem;
...
void Init()
{
if (GravitySensor.current != null)
{
InputSystem.EnableDevice(GravitySensor.current);
}
}
using UnityEngine.InputSystem;
...
void Update()
{
var gravitySensor = GravitySensor.current;
if (gravitySensor != null)
{
var enabled = gravitySensor.enabled;
Vector3 gravity = gravitySensor.gravity.ReadValue();
sensorLabel.text = $"enabled: {enabled}\n" +
$"Gravity\nX={gravity.x:#0.00} Y={gravity.y:#0.00} Z={gravity.z:#0.00}";
}
}
iphoneをおおむね水平にしたときの値が以下のように取れる。
で、実験した結果gravity.xが以下の数値になることがわかった。
下が地面とする
状況 | ホームボタンが下 | ホームボタンが右 | ホームボタンが上 |
---|---|---|---|
gravity.x | 1.00 | 0.00 | -1.00 |
gravity.xの値の考察
おそらく青矢印で示した重力の向きと、ピンクで示したスマホの向きのベクトルの内積を取っている。
単位ベクトルの内積は同じ向きなら最大、逆向きなら最小の性質をもつ。
すなわちホームボタンが下(重力と同じ向き)なら1で、逆なら-1ということになる。
結論
前提: スマホ傾けるのは180度未満とする!
gravity.xが正 -> ホームボタンが下 -> 右に回転させている
gravity.xが負 -> ホームボタンが上 -> 左に回転させている
つまり、例えばスマホの傾きによってキャラクターを横移動させたい場合には
右への移動スピード * gravity.x
とすればスマホの傾きによって横移動が可能。
参考
【Unity】Input System(新しい入力システム)の使い方
Unityでモーションセンサーを使ってモバイルゲームを作る