2016/12/28 コメントでInput.accelerationEventsプロパティを使えば解決するとのコメント頂いたので修正しました.
Unityで加速度を扱う時に躓いた問題です.
#Unityには指定秒分の加速度データを取得する方法がない?
そもそもUnityはゲーム開発用のIDEですので,一定量データをためてどうこうという処理を想定していないのかもしれません.
今回私は,ゲーム内での歩行検出をする必要があったため一定量の加速度データを取得しなければなりませんでした.
(加速度を使用した歩行検出のアルゴリズムはそのうち書こうと思います.)
まず,一般的なUnityで加速度を取得するプログラムは次のようなものです.
float acc_x = Input.acceleration.x; //X軸の加速度
float acc_y = Input.acceleration.y; //Y軸の加速度
float acc_z = Input.acceleration.z; //Z軸の加速度
これで端末のセンサーから加速度を取得できます.
しかし問題はここからです.
これはこのコードが呼び出された時にセンサーの加速度の値を取得するものです.
つまりはリアルタイムな値を取得しているわけです.
加速度を使って歩行検出をする場合,数秒分の加速度データを使い判定を行うのでリアルタイムな値が取得できるだけではダメなのです.
しかしUnityには,数秒分の加速度データを持ってくるライブラリが(私が探した限りでは)存在しません.
#指定秒分の加速度を取得する
今回は10秒分の加速度データを取るプログラムを想定します.
Vector3[] acc; //3軸の加速度を格納する
int index; //配列のインデックス
Start () {
acc = new Vector3[600]; //配列を初期化
index = 0;
}
Update () {
//配列へ加速度データを格納
foreach (AccelerationEvent ae in Input.accelerationEvents) {
acc [index] = ae.acceleration;
index++;
}
//配列が埋まったら実行する
if (index == 600) {
/* ~~処理~~ */
index = 0; //インデックスをリセット
}
}
Input.accelerationEventsプロパティを使用して加速度を取得することで,fpsに依存せず加速度センサーから周期的な値を取得することができます.
AndroidやiOSの場合,加速度センサーの周波数は60Hzに設定されているため,配列のサイズを60×必要な秒数分にすることで,指定秒分の加速度を得ることができます.
#加速度センサーの周波数を変更できるのか?
今回は歩行検出のために加速度を取得したのですが,歩行検出をするだけならば加速度センサーの周波数は20Hzもあれば十分です.
計算量を減らせば処理も軽くなるため,加速度センサーの周波数を変更する方法をさがしました.
加速度センサーの周波数はPlayerSettionの中のOtherSettingの中のConfigurationの中のAccelerometerFrequencyで変更できます.
しかし,iOSの場合はその項目があるのですが,Androidの場合は同じ場所に見当たりません.
###iOSのPlayerSetting
###AndroidのPlayerSetting
Androidだけ別の場所に変更する項目があるとは考えられないので,Androidの場合は加速度センサーの周波数を変更することはできないようです.