2016-08-15 30 views
1

Androidで光センサーをUnityで使用したいと思います。 Unityはこれを行うことはできませんし、それを行うことができる店舗にはアセット/プラグインはありません。そして、Googleはこの質問とそれほどやさしいない...ユニティでAndroid光センサーを使用する方法

+0

この問題を処理するにはしばらく時間がかかり、Web上で解決策が見られないためです。だから私は他の人が私のように闘うのを防ぐために共有したいと思っていました。また、可視性のためにスタックオーバーフローを選択します。私がGoogleで検索するとき、私はブログのリンクよりもSOのリンクを好む。 (そして私は途中でブログを持っていませんでした) –

+0

それは非常に具体的な質問だったら私はそれを詳しく述べるべきです。しかし、実際には私の質問は文字通り "私は光センサーの価値を1つにしたい"と答えた45ドルのプラグインを除いて答えはありません。だから私は私のものを与えた。コードに問題がある人は、最大限の情報を提供する必要がありますが、ここでは該当しません。 –

+1

これは非常に有用な質問と答えだと思います。私はこれまで同様のことをしてきました。多くの人がそれをやりたいと思っています。唯一の違いは、センサ値が変更されたときに 'UnityPlayer.UnitySendMessage'を使ってC#関数を呼び出すことです。 – Programmer

答えて

4

シンプルバージョン

この部分は私のコードを使用する方法について説明します。

  1. Assets/Plugins/Androidフォルダ
  2. .jarファイルを入れその後、単にあなたが望んでいたゲームオブジェクトのスクリプトLightSensorPluginScript.csを追加します。あなたがセンサ値取得したい場合
  3. は次に:

    TextMesh tm; 
    LightSensorPluginScript test; 
    void Start() { 
        tm = transform.GetComponent<TextMesh>(); 
        test = GetComponent<LightSensorPluginScript>(); 
    } 
    void Update() { 
        tm.text = test.getLux().ToString(); 
    } 
    
  4. をすべてのファイルは、このzip archive

に詳細なバージョン

この部分は、作成する方法について説明していますプラグイン。

まずAndroidライブラリを作成する必要があります。 Android Studioを使用している場合は、.aarファイルに変換されます。 zipファイルのようにそれらを抽出し、あなたが望むclasses.jarファイルを見つけるでしょう。名前を変更することもできますが、Unityは気にしませんでした。

AndroidのJavaコード

public class LightSensorLib{ 

    private SensorManager mSensorManager; 
    private Sensor mSensorRot; 
    private float lux = -1000; 

    public void init(Context context) { 
     mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 
     mSensorRot = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 

     SensorEventListener mySensorEventListener = new SensorEventListener() { 
      @Override 
      public void onSensorChanged(SensorEvent event) { 
       float sensorData[]; 

       if(event.sensor.getType()== Sensor.TYPE_LIGHT) { 
        sensorData = event.values.clone(); 
        lux = sensorData[0]; 
       } 
      } 

      @Override 
      public void onAccuracyChanged(Sensor sensor, int accuracy) {} 
     }; 
     mSensorManager.registerListener(mySensorEventListener, mSensorRot, 500); 
    } 

    public float getLux() { 
     return lux; 
    } 
} 

その後、私は今あなたができる

public class LightSensorPluginScript : MonoBehaviour { 
    private AndroidJavaObject activityContext = null; 
    private AndroidJavaObject jo = null; 
    AndroidJavaClass activityClass = null; 

    void Start() { 
     #if UNITY_ANDROID 
     activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
     activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity"); 

     jo = new AndroidJavaObject("com.etiennefrank.lightsensorlib.LightSensorLib"); 
     jo.Call("init", activityContext); 
     #endif 
    } 

    public float getLux() { 
     #if UNITY_ANDROID 
     return jo.Call<float>("getLux"); 
     #endif 
    } 
} 

C#橋コード

AndroidのJavaとユニティ間のブリッジを行い、C#のスクリプトを持っていますこの投稿のSimple version部分で説明されていることを実行するセンサ。

精度が必要な場合は、投稿に回答して更新していただきたいと思います。

IO版では申し訳ありませんが、これを開発するためのMacはありません...私に1本を貸したいのであれば、それをするのがうれしいです。

アセットストアにプラグインとして追加することはできますが、少し面倒です。だから、私はStackOverflow上でそれをポストエディタが本当にきれいに投稿することを好む。

最後に、一部の開発者に役立つことを願っています。

関連する問題