Попытка реализовать метод поворота объекта в единстве на основе вертикальной и горизонтальной осей, который определяется положением курсора на изображении.
Создание 3D-игры для мобильных устройств с джойстиком для управления. Цель состоит в том, чтобы вращаться с помощью джойстика. Пример изображения: https://imgur.com/a/hd9QiVe Зеленый круг перемещается при нажатии пользователем и возвращается Значения X и Y от -1 до 1, где 0 находится посередине. Просто чтобы представить, как происходит ввод: https://imgur.com/a/8QVRrIh Как показано на изображении, мне просто нужен угол или способ перемещения объекта в направлении обнаружения пользовательского ввода.
Пробовал несколько методов расчета угла с помощью atan и tan, но мои математические расчеты довольно плохи, и я не совсем уверен, что в первую очередь получаю правильные значения.
//фоновый джойстик относится к белому кругу на первом изображении
pos.x = (pos.x / backgroundJoystick.rectTransform.sizeDelta.x);
pos.y = (pos.y / backgroundJoystick.rectTransform.sizeDelta.y);
inputVector = new Vector3(pos.x * 2f, 0, pos.y * 2f);
inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;
// захват ввода по оси
public float Horizontal()
{
if (inputVector.x != 0)
{
return inputVector.x;
}
else
return Input.GetAxis("Horizontal");
}
public float Vertical()
{
if (inputVector.z != 0)
{
return inputVector.z;
}
else
return Input.GetAxis("Vertical");
}
Как показано в коде, угол необходим из input.getaxis для вертикали и горизонтали, чтобы направить объект под углом. Используемые в настоящее время формулы не дают никаких углов.
Если вы хотите получить угол вектора, используйте Vector2.SignedAngle()
:
var inputAngle = Vector2.SignedAngle(Vector2.right, inputVector);
Углы относительны, поэтому вам нужно указать Vector2.right
в качестве первого параметра. Также есть метод Vector2.Angle()
, но он просто возвращает расстояние между двумя углами и не учитывает направление.
Если вам нужно убедиться, что ваши входные векторы — это то, что вы думаете, используйте Debug.Log()
, чтобы напечатать inputVector
.
Спасибо, этот фрагмент кода исправил мою проблему: var inputAngle = Vector2.SignedAngle(Vector2.right, pos); Одна вещь, которую я изменил, заключалась в том, чтобы использовать предыдущий Vector2, а не Vector3, чтобы получить свой угол, как было дано здесь: reddit.com/r/Unity2D/comments/7irplq/…