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

Ice*_*aze 2 android unity-game-engine

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

Ice*_*aze 6

简单版

这部分解释了如何使用我的代码.

  1. .jar文件放入Assets/Plugins/Android文件夹
  2. 然后只需LightSensorPluginScript.cs在您想要的GameObject上添加脚本.
  3. 然后,如果你想获得传感器值:

    TextMesh tm;
    LightSensorPluginScript test;
    void Start() {
        tm = transform.GetComponent<TextMesh>();
        test = GetComponent<LightSensorPluginScript> ();
    }
    void Update() { 
        tm.text = test.getLux().ToString();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以执行Simple version本文后面部分中的说明来使用传感器.

如果您想要任何精度,我很乐意回答并更新帖子.

对于IOs版本我很抱歉,但我没有开发这个...所以如果你想借给我一个,我很乐意这样做.

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

最后,我希望它能帮助一些开发人员.