У меня опыт AR, когда я хотел бы использовать компас телефона, чтобы направить игрока на истинный север, но у меня возникают проблемы с сглаживанием показаний компаса на устройствах Android.Код, с которым я экспериментировал до сих пор, записывает определенное количество чтений в очередь, копирует очередь в список, а затем, как только список заполнен, он принимает среднее значение всех чтений.Отсюда я хотел бы масштабировать чтение между -1 и 1, где 0 представляет Юг.Затем я хочу, чтобы эти данные использовались для поворота изображения компаса на слое графического интерфейса.
Данные далеко не такие гладкие, как хотелось бы, но вот код, который у меня есть:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class CompassSlider : MonoBehaviour
{
public float reading;
public Queue<float> data;
private float[] dataList;
public int maxData = 100;
public int count;
public float sum, average;
public float dampening = 0.1f;
public float rotationToNorth;
// Use this for initialization
void Start()
{
data = new Queue<float>();
dataList = new float[maxData];
}
// Update is called once per frame
void Update()
{
Input.location.Start();
Input.compass.enabled = true;
count = data.Count;
if (data.Count > 0)
{
data.CopyTo(dataList, 0);
}
if (data.Count == maxData)
{
for (int i = 0; i < data.Count; i++)
{
sum += dataList[i];
}
if (Mathf.Abs(dataList[maxData - 1]) > 0)
{
average = sum / maxData;
sum = 0;
data.Clear();
dataList = new float[maxData];
}
}
if (data.Count >= maxData)
{
data.Dequeue();
}
reading = Mathf.Round(Input.compass.trueHeading);
data.Enqueue(reading);
if (count == maxData) {
rotationToNorth = average / 180;
rotationToNorth = (Mathf.Round(rotationToNorth * 10)) / 10;
rotationToNorth = rotationToNorth - 1;
}
}
}