#前書き#
先日、スマホゲームを扱う際の「振る」という動作について調べていたところ読みやすい記事が少なかったため解説します。
アセット等は使わずC#でゴリゴリいきます。
例によって例のごとくかなり初心者向きです。
#方針#
どのように「振る」アクションを検知していくか について解説します。
(1) 毎フレームごとにベクトル(加速度,傾き とも記述される)を検知し、Vector3型の変数に代入しておきます。
(2) 現フレームと1つ前のフレームの内積を計算します。
※内積についてわからない方は数学の分野となりますので軽く調べてみてください。内積がわかれば十分です。
(3) 内積の値によって判別します。
- 内積の値が正の場合
二つのベクトルのなす角が90°より小さいので同じ方向に動いています。 - 内積の値が負の場合
二つのベクトルのなす角が90°より大きいので逆の方向に動いています。
#スクリプト解説#
private Vector3 Acceleration;
private Vector3 preAcceleration;
float DotProduct;
public static int ShakeCount;
まずは変数から
Acceleration : 現フレームのベクトルを代入します。
preAcceleration : 1つ前のフレームのベクトルを代入します。
DotProduct : ベクトルの内積を代入します。
ShakeCount : 今回は振る動作の検知結果として振った回数をカウントします。
void ShakeCheck()
{
preAcceleration = Acceleration;
Acceleration = Input.acceleration;
DotProduct = Vector3.Dot(Acceleration, preAcceleration);
if (DotProduct < 0)
{
ShakeCount++;
}
}
1行目でpreAccelerationにAccelerationの値を代入します。
2行目でAccelerationに現フレームでのベクトルを代入します。
この1行目と2行目を入れ替えてしまうとちゃんと動かないので注意して下さい
3行目で内積を計算しています。
4-7行目で現フレームと前フレームが逆方向に動いているときにShakeCountを増やす記述をしています。
以上で解説は終了です。
#最後に#
今回はシェイクジェスチャー、「振る」という動作について解説しました。
よろしければ使ってやってください。