Я хочу использовать датчик света на Android с Unity. Unity не может этого сделать, и в магазине нет актива/плагина, который мог бы это сделать. И Google не так Товарищеский с этим вопросом ...Как использовать датчик света Android в Unity
ответ
Простая версия
Эта часть объясняет, как использовать мой код.
- Поместите файл
.jar
вAssets/Plugins/Android
папку - Затем просто добавить скрипт
LightSensorPluginScript.cs
на GameObject вы хотели. Тогда, если вы хотите, чтобы получить значение датчика:
TextMesh tm; LightSensorPluginScript test; void Start() { tm = transform.GetComponent<TextMesh>(); test = GetComponent<LightSensorPluginScript>(); } void Update() { tm.text = test.getLux().ToString(); }
Все файлы можно найти в этом zip archive
Подробная версия
Эта часть объясняет, как создать плагин.
Прежде всего, вам необходимо создать библиотеку 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
датчик.
Если вы хотите любой точности, я был бы рад ответить и обновить сообщение.
Для версии IO Извините, но у меня нет макинтоша, чтобы развить это ... Поэтому, если вы хотите одолжить мне одну, я был бы рад сделать это.
Я мог бы добавить его в качестве плагина в хранилище активов, но он чувствует себя немного громоздким. Поэтому я предпочитаю публиковать его в StackOverflow, где редактор сообщений действительно опрятен.
Наконец-то я надеюсь, что это поможет некоторым разработчикам.
Поскольку мне требуется некоторое время, чтобы справиться с этой проблемой и не видели никаких решений в Интернете. Поэтому я хотел поделиться им, чтобы другие не могли бороться, как я. И я выбираю Stack Overflow для видимости. Когда я ищу в google, я предпочитаю ссылку SO больше, чем ссылку в блоге. (Кстати, у меня нет блога) –
Если бы это был очень конкретный вопрос, я должен его разработать. Но на самом деле мой вопрос был буквально «Я хочу получить значение светочувствительного сенсора в единстве», и кроме плагина стоимостью 45 $ нет ответа. Поэтому я дал мне. Когда у людей возникают проблемы в коде, они должны предоставить максимум информации, но здесь дело обстоит не так. –
Я думаю, что это очень полезный вопрос и ответ. Я уже делал что-то подобное и знаю, что многие люди тоже хотят это сделать, и это должно помочь им. Единственное различие заключается в том, что я использую 'UnityPlayer.UnitySendMessage' для вызова функции C# при изменении значения датчика. – Programmer