XamarinやCocosSharpを使用したゲームアプリ開発時のTIPSを紹介しています。

Elements

[Xamarin] [CocosSharp] CocosSharp上で加速度センサー情報を取得すると取得情報が遅延する

CocosSharpには CCAccelerometer, CCEventAccelerate, CCAcceleration などの加速度センサーに関するクラスが用意されていますが、これらを使用して加速度センサーの値を取得すると取得値に大幅な遅延が発生する場合があります。

具体的には取得開始直後から数フレームの遅延が生じ、時間経過とともに遅延が拡大していくというものです。

また、iOS、Androidのプラットフォームごとの感度の違いによる取得値の絶対値の違いを吸収する必要もあります。

これらの現象を解決するには、加速度センサーの値の取得をCocosSharpではなくXamarinのプラットフォーム依存コードで行い、あらかじめデバイスごとの感度の違いを調整した値をXamarin側からでもCocosSharp側からでも参照可能なクラス(この場合、AccelerometerInfo)のプロパティに書き込み、CocosSharp側からはその値を参照します。

こうする事でCocosSharpのゲーム処理部分はプラットフォームに非依存なコードにする事ができます。

iOS


private object syncLock = new object();
private CMMotionManager cMMotionManager = new CMMotionManager();

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    cMMotionManager.StartAccelerometerUpdates(NSOperationQueue.CurrentQueue, (data, error) =>
    {
        lock (syncLock)
        {
            AccelerometerInfo.Default.AccelerationX = data.Acceleration.X;
            AccelerometerInfo.Default.AccelerationY = data.Acceleration.Y;
            AccelerometerInfo.Default.AccelerationZ = data.Acceleration.Z;
        }
    });
}

Android


private object syncLock = new object();
private SensorManager sensorManager = (SensorManager)GetSystemService(Context.SensorService);

public void OnSensorChanged(SensorEvent e)
{
    lock (syncLock)
    {
        AccelerometerInfo.Default.AccelerationX = e.Values[0];
        AccelerometerInfo.Default.AccelerationY = e.Values[1];
        AccelerometerInfo.Default.AccelerationZ = e.Values[2];
    }
}

宜しければシェアをお願いします。

facebooktwittergoogle_plusredditpinterestlinkedinmail