web-dev-qa-db-ja.com

Unity3Dを使用してモバイルデバイスでシェイクモーションを検出するにはどうすればよいですか? C#

Unityにはこのためのイベントトリガーがあると思いますが、Unity3dのドキュメントで見つけることができません。加速度計の変更を処理する必要がありますか?

皆さん、ありがとうございました。

10
Mage

「揺れ」の検出に関する優れた議論は、Unityフォーラムの このスレッド にあります。

ブレイディの投稿から:

いくつかのApple iPhoneサンプルアプリでわかることから、基本的には、ベクトルの大きさのしきい値を設定し、加速度計の値にハイパスフィルターを設定し、その加速度の大きさがベクトルが設定されたしきい値よりも長くなると、「シェイク」と見なされます。

jmppの推奨コード(読みやすく、有効なC#に近づけるように変更):

float accelerometerUpdateInterval = 1.0f / 60.0f;
// The greater the value of LowPassKernelWidthInSeconds, the slower the
// filtered value will converge towards current input sample (and vice versa).
float lowPassKernelWidthInSeconds = 1.0f;
// This next parameter is initialized to 2.0 per Apple's recommendation,
// or at least according to Brady! ;)
float shakeDetectionThreshold = 2.0f;

float lowPassFilterFactor;
Vector3 lowPassValue;

void Start()
{
    lowPassFilterFactor = accelerometerUpdateInterval / lowPassKernelWidthInSeconds;
    shakeDetectionThreshold *= shakeDetectionThreshold;
    lowPassValue = Input.acceleration;
}

void Update()
{
    Vector3 acceleration = Input.acceleration;
    lowPassValue = Vector3.Lerp(lowPassValue, acceleration, lowPassFilterFactor);
    Vector3 deltaAcceleration = acceleration - lowPassValue;

    if (deltaAcceleration.sqrMagnitude >= shakeDetectionThreshold)
    {
        // Perform your "shaking actions" here. If necessary, add suitable
        // guards in the if check above to avoid redundant handling during
        // the same shake (e.g. a minimum refractory period).
        Debug.Log("Shake event detected at time "+Time.time);
    }
}

注:完全なコンテキストについては、スレッド全体を読むことをお勧めします。

15
Dan Bechard