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

时间:2016-08-15 19:40:03

标签: android unity3d

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

2 个答案:

答案 0 :(得分:6)

简易版

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

  1. .jar文件放入Assets/Plugins/Android文件夹
  2. 然后只需在您想要的GameObject上添加脚本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

  5. 中找到所有文件

    详细版本

    这部分解释了如何创建插件。

    首先,您必须创建一个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();
}

}