2016-08-15 146 views
1

我想在Unity上使用Unity光傳感器。 Unity無法做到這一點,商店裏沒有資產/插件可以做到這一點。和谷歌是不是這個問題,以便員工共贏...如何在Unity中使用Android光傳感器

+0

因爲我需要一些時間來處理這個問題,並沒有在網上看到任何解決方案。所以我想分享它來防止別人像我一樣掙扎。我選擇堆棧溢出的可見性。當我在谷歌上搜索時,我更喜歡SO鏈接而不是博客鏈接。 (而且我還沒有一個博客的方式) –

+0

如果這是一個非常具體的問題,我應該詳細說明它。但事實上,我的問題實際上是「我想要統一光傳感器的價值」,除了花費45美元的插件沒有答案。所以我給了我的。當人們在代碼中遇到問題時,他們必須提供最多的信息,但在這裏並不是這樣。 –

+1

我認爲這是一個非常有用的問題和答案。我之前做過類似的事情,並且知道很多人也想這樣做,這應該可以幫助他們。唯一的區別是當傳感器值發生變化時,我使用UnityPlayer.UnitySendMessage來調用C#函數。 – Programmer

回答

4

簡易型

這部分解釋瞭如何使用我的代碼。

  1. .jar文件到文件夾Assets/Plugins/Android
  2. 然後,只需添加腳本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文件,這是你想要的正確的.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; 
    } 
} 

然後,我有一個C#腳本誰做Android的Java和團結

C#橋碼之間的橋樑

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 
    } 
} 

現在,您可以請執行本帖子的Simple version部分中的解釋傳感器。

如果你想要任何精度,我會很樂意回答和更新帖子。

對於IO版本,我很抱歉,但我沒有MAC來開發這個...所以如果你想借我一個,我會很樂意這樣做。

我可以將它作爲插件添加到資產商店,但感覺有點麻煩。所以我更喜歡將它發佈在StackOverflow上,在這裏,帖子編輯器非常整潔。

最後我希望它能幫助一些開發者。