Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Unity中使用Android光传感器_Android_Unity3d - Fatal编程技术网

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

如何在Unity中使用Android光传感器,android,unity3d,Android,Unity3d,我想用Unity在Android上使用光传感器。Unity无法做到这一点,商店中也没有能够做到这一点的资产/插件。谷歌对这个问题并不那么狂热 简单版本 这一部分解释如何使用我的代码 将.jar文件放入Assets/Plugins/Android文件夹 然后只需在您想要的游戏对象上添加脚本LightSensorPluginScript.cs 然后,如果要获取传感器值: TextMesh tm; LightSensorPluginScript test; void Start() { tm

我想用Unity在Android上使用光传感器。Unity无法做到这一点,商店中也没有能够做到这一点的资产/插件。谷歌对这个问题并不那么狂热

简单版本 这一部分解释如何使用我的代码

  • .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#函数。