我想在Android上使用Unity上的光传感器。 Unity无法做到这一点,商店里没有资产/插件可以做到这一点。谷歌对这个问题并不那么友好......
答案 0 :(得分:6)
这部分解释了如何使用我的代码。
.jar
文件放入Assets/Plugins/Android
文件夹LightSensorPluginScript.cs
。然后,如果你想获得传感器值:
TextMesh tm;
LightSensorPluginScript test;
void Start() {
tm = transform.GetComponent<TextMesh>();
test = GetComponent<LightSensorPluginScript> ();
}
void Update() {
tm.text = test.getLux().ToString();
}
可以在此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和Unity之间建立了桥梁
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
部分中的说明,以使用传感器。
如果您想要任何精确度,我很乐意回答并更新帖子。
对于IOs版本我很抱歉,但我没有开发这个...所以如果你想借给我一个,我很乐意这样做。
我可以将它作为插件添加到资产商店,但感觉有点麻烦。所以我更喜欢将它发布在StackOverflow上,其中帖子编辑器非常整洁。
最后,我希望它可以帮助一些开发人员。
答案 1 :(得分:-1)
using UnityEngine;
using System;
using System.Collections;
public class LightSensorPluginScript : MonoBehaviour {
private AndroidJavaObject activityContext = null;
private AndroidJavaObject jo = null;
AndroidJavaClass activityClass = null;
public TextMesh tm;
LightSensorPluginScript test;
void Start () {
#if UNITY_ANDROID
activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
tm = transform.GetComponent<TextMesh>();
test = GetComponent<LightSensorPluginScript>();
jo = new AndroidJavaObject("com.etiennefrank.lightsensorlib.LightSensorLib");
jo.Call("init", activityContext);
#endif
}
public float getLux() {
#if UNITY_ANDROID
return jo.Call<float>("getLux");
#endif
}
void Update()
{
tm.text = test.getLux().ToString();
}
}