2016-08-15 97 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上,在这里,帖子编辑器非常整洁。

最后我希望它能帮助一些开发者。