Comment lire les données du Gyroscope de votre Android avec Unity

Bonjour à tous,

Nous revoilà pour un nouvel article, encore sur Unity3D.

J’ai utilisé la technique de ce monsieur : RandomActsOfDev.
Je ne prétends pas avoir inventé ce plugin, j’en fais une traduction à ma sauce pour les français les plus allergiques à l’anglais(si si ça existe, je pourrai vous en présenter plusieurs rien que dans ma classe ^^).

Lisez mon article sur la manière de paramétrer un plugin Android pour Unity ici.

Dans ce même package, créez une class « CompassActivity » et collez y le code suivant:


package com.mycompany.mygame;
import com.unity3d.player.UnityPlayerActivity;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.app.Activity;

public class CompassActivity extends UnityPlayerActivity {
private static final String TAG = "Compass";

private SensorManager mSensorManager;
private Sensor mSensor;

static public float xmag;
static public float ymag;
static public float zmag;

private final SensorEventListener mListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if (Config.DEBUG) Log.d(TAG,
"sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");

xmag = event.values[0];
ymag = event.values[1];
zmag = event.values[2];
}

public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};

@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}

@Override
protected void onResume()
{
if (Config.DEBUG) Log.d(TAG, "onResume");
super.onResume();

mSensorManager.registerListener(mListener, mSensor,
SensorManager.SENSOR_DELAY_GAME);
}

@Override
protected void onStop()
{
if (Config.DEBUG) Log.d(TAG, "onStop");
mSensorManager.unregisterListener(mListener);
super.onStop();
}

public static float getX() {
return xmag;
}

public static float getY() {
return ymag;
}

public static float getZ() {
return zmag;
}
}

A présent attaquons le manifest, il doit ressembler à ceci:


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.Company.ProductName"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />

<application android:label="@string/app_name"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">
<activity android:name="com.mycompany.mygame.CompassActivity"
android:label="@string/app_name">
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

</activity>
</application>

</manifest>

A présent il va falloir créer le fichier .jar qui servira de plugin. Pour ce faire, cliquez droit sur votre projet Eclipse et faites « Export ».
Il vous faut creer un dossier Plugins dans le dossier Assets de votre projet, puis un dossier Android dans le dossier Plugins.
Choisissez le dossier Android pour exporter votre fichier jar. Donnez le nom de votre choix.

Retournez à présent dans Unity.

Créez un nouveau script peu importe le nom et attachez le à votre caméra.

Collez y le code suivant:


using UnityEngine;
using System.Collections;

public class CompassJNI : MonoBehaviour {

static float xValue;
static float yValue;
static float zValue;
// Use this for initialization
void Start () {
AndroidJNI.AttachCurrentThread();
}

// Update is called once per frame
void Update () {
using (AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {

using (AndroidJavaObject obj_Activity = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) {

AndroidJavaClass cls_CompassActivity = new AndroidJavaClass("com.mycompany.mygame.CompassActivity");

xValue = cls_CompassActivity.CallStatic<float>("getX");
yValue = cls_CompassActivity.CallStatic<float>("getY");
zValue = cls_CompassActivity.CallStatic<float>("getZ");

}
}

Debug.Log("Compass values are " + xValue.ToString() + "," + yValue.ToString() + "," + zValue.ToString());
}

void OnGUI() {
GUI.Label(new Rect(Screen.width / 2 -200, Screen.height / 2, 400,100), "xmag = " + xValue.ToString() + " ymag = " + yValue.ToString() + " zmag = " + zValue.ToString());
}
}

Vous l’aurez compris si vous avez un peu lu le code, utilisez xValue, yValue et zValue pour lire les données du Gyroscope. Si je ne me trompe pas, xValue correspond à l’orientation de l’appareil par rapport au nord, yValue l’inclinaison de la tablette vers le haut et le bas et zValue l’inclinaison de la tablette sur les côtés.

Voila vous pouvez à présent vous amuser avec le gyroscope de votre appareil.

Encore merci à la personne qui m’a permis de faire cet article et n’hésitez pas à aller acheter ses jeux pour le soutenir.

A bientot :)

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS

Laisser un commentaire