с использованием Vector3.forward
Сокращение для записи new Vector3(0, 0, 1)
.
возвращает вам прямое направление оси Z самого Unity. Это полностью зависит от ориентации вашего устройства, когда вы запустили Unity / ваше приложение, и не имеет никакого отношения к координатам реального мира.
Скорее всего, вы ищете Compass
, который возвращает фактическую ориентацию вашего телефона, например, используя magneticHeading
Курс в градусах относительно magneti c Северный полюс.
Значение в этом свойстве всегда измеряется относительно верхней части экрана в его текущей ориентации. Курс намагнитного c севера не совсем совпадает с истинным географическим севером - для получения точного курса используйте свойство trueHeading
.
public class Example : MonoBehaviour
{
void Update()
{
// Orient an object to point to magnetic north.
transform.rotation = Quaternion.Euler(0, -Input.compass.magneticHeading, 0);
}
}
или используя trueHeading
Курс в градусах относительно geographi c Северный полюс.
Значение в этом свойство всегда измеряется относительно верхней части экрана в его текущей ориентации. Обратите внимание, что если вы хотите, чтобы это свойство содержало допустимое значение, вы также должны включить обновление местоположения, позвонив по номеру Input.location.Start()
.
using UnityEngine;
public class Example : MonoBehaviour
{
void Start()
{
Input.location.Start();
}
void Update()
{
// Orient an object to point northward.
transform.rotation = Quaternion.Euler(0, -Input.compass.trueHeading, 0);
}
}
Так что для вашего варианта использования вы просто используете Например,
using UnityEngine;
public enum Heading
{
North,
East,
South,
West
}
public class Example : MonoBehaviour
{
[Header("Debug")]
[SerializeField] [Range(0f, 360f)] private float northHeading;
[Header("OutputValues")]
[SerializeField] private float myHeading;
[SerializeField] private float dif;
[SerializeField] private Heading heading;
// Update is called once per frame
private void Update()
{
// only use the Y component of the objects orientation
// always returns a value between 0 and 360
myHeading = transform.eulerAngles.y;
// also this is always a value between 0 and 360
northHeading = Input.compass.magneticHeading;
dif = myHeading - northHeading;
// wrap the value so it is always between 0 and 360
if (dif < 0) dif += 360f;
if (dif > 45 && dif <= 135)
{
heading = Heading.East;
}
else if (dif > 135 && dif <= 225)
{
heading = Heading.South;
}
else if (dif > 225 && dif <= 315)
{
heading = Heading.West;
}
else
{
heading = Heading.North;
}
}
// Only for debug and demo
// draw a pointer towards north
private void OnDrawGizmos()
{
var northDirection = (Quaternion.Euler(0, northHeading, 0) * Vector3.forward).normalized;
Gizmos.color = Color.red;
Gizmos.DrawLine(transform.position, transform.position + northDirection);
var objectDirection = (Quaternion.Euler(0, transform.eulerAngles.y, 0) * Vector3.forward).normalized;
Gizmos.color = Color.blue;
Gizmos.DrawLine(transform.position, transform.position + objectDirection);
}
}
В небольшом демонстрационном примере вы видите синий указатель для направления объекта вперед и красный вектор для направления на север. Вы можете видеть, как значение перечисления Heading
изменяется в зависимости от ориентации объектов.
Поскольку я сделал это на P C, мне пришлось вручную «настраивать» направление на север, позже вы будете получите это с вашего телефона.