如何在Unity中使用Android光传感器
我想用Unity在Android上使用光传感器。Unity无法做到这一点,商店中也没有能够做到这一点的资产/插件。谷歌对这个问题并不那么狂热 简单版本 这一部分解释如何使用我的代码如何在Unity中使用Android光传感器,android,unity3d,Android,Unity3d,我想用Unity在Android上使用光传感器。Unity无法做到这一点,商店中也没有能够做到这一点的资产/插件。谷歌对这个问题并不那么狂热 简单版本 这一部分解释如何使用我的代码 将.jar文件放入Assets/Plugins/Android文件夹 然后只需在您想要的游戏对象上添加脚本LightSensorPluginScript.cs 然后,如果要获取传感器值: TextMesh tm; LightSensorPluginScript test; void Start() { tm
.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();
}
然后我有一个C#脚本,它在Android Java和Unity之间架起了桥梁
C#桥接器代码
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
}
}
公共类LightSensorPluginScript:MonoBehavior{
私有AndroidJavaObject activityContext=null;
私有AndroidJavaObject jo=null;
AndroidJavaClass activityClass=null;
无效开始(){
#如果你是安卓
activityClass=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
activityContext=activityClass.GetStatic(“currentActivity”);
jo=新的AndroidJavaObject(“com.etiennefrank.lightsensorlib.lightsensorlib”);
调用(“init”,activityContext);
#恩迪夫
}
公共浮动getLux(){
#如果你是安卓
返回工作呼叫(“getLux”);
#恩迪夫
}
}
现在,您可以按照本文的简单版部分的说明使用传感器
如果你想要任何精确性,我很乐意回答并更新帖子
对于IOs版本,我很抱歉,但我没有mac来开发这个。。。所以如果你想借我一个,我很乐意
我可以把它作为一个插件添加到资产商店中,但感觉有点麻烦。所以我更喜欢把它发布在StackOverflow上,那里的post编辑器非常整洁
最后,我希望它能帮助一些开发者。使用UnityEngine;
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();
}
使用制度;
使用系统集合;
公共类LightSensorPluginScript:MonoBehavior{
私有AndroidJavaObject activityContext=null;
私有AndroidJavaObject jo=null;
AndroidJavaClass activityClass=null;
公共TextMesh tm;
LightSensorPluginScript测试;
无效开始(){
#如果你是安卓
activityClass=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
activityContext=activityClass.GetStatic(“currentActivity”);
tm=transform.GetComponent();
test=GetComponent();
jo=新的AndroidJavaObject(“com.etiennefrank.lightsensorlib.lightsensorlib”);
调用(“init”,activityContext);
#恩迪夫
}
公共浮动getLux(){
#如果你是安卓
返回工作呼叫(“getLux”);
#恩迪夫
}
无效更新()
{
tm.text=test.getLux().ToString();
}
}因为我花了一些时间来处理这个问题,还没有在网上看到任何解决方案。所以我想分享它,以防止其他人像我一样挣扎。我选择堆栈溢出作为可见性。当我在谷歌上搜索时,我更喜欢SO链接而不是博客链接。(顺便说一下,我没有博客)如果这是一个非常具体的问题,我应该详细说明。但事实上,我的问题是“我想得到unity中光传感器的价值”,除了一个45美元的插件外,没有答案。所以我给了我的。当人们在代码中遇到问题时,他们必须提供最大限度的信息,但这里的情况并非如此。我认为这是一个非常有用的问题和答案。我以前也做过类似的事情,我知道很多人也想这样做,这应该会帮助他们。唯一的区别是,当传感器值更改时,我使用UnityPlayer.UnitySendMessage
调用C#函数。