繁体   English   中英

如何在Unity中使用Android光传感器

[英]How to use the Android light sensor in Unity

我想在带有Unity的Android上使用光传感器。 Unity无法做到这一点,并且商店中没有资产/插件可以做到这一点。 谷歌对这个问题不是那么友好...

简单版

本部分说明如何使用我的代码。

  1. .jar文件放入Assets/Plugins/Android文件夹
  2. 然后只需在所需的LightSensorPluginScript.cs上添加脚本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存档中找到

详细版本

本部分说明如何创建插件。

首先,您必须创建一个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版本,我很抱歉,但是我没有mac来开发它。因此,如果您想借给我一个,我会很乐意这样做。

我可以将其添加为资产商店中的插件,但感觉有点麻烦。 因此,我更喜欢将其发布在StackOverflow上,其中的帖子编辑器非常整洁。

最后,我希望它对一些开发人员有所帮助。

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();
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM