Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Принятие отсутствия наклона джойстика на геймпаде в Unity.

Коля Колесников Ученик (181), закрыт 1 неделю назад
У меня есть вот такой код:
 private void Awake() 
{
controls = new Controller();
controls.Enable();
controls.Car.Forward.performed += ctx => Forward(); // Пример обработчика нажатия кнопки
controls.Car.Back.performed += ctx => Back();
controls.Car.Stop.performed += ctx => Stop();
controls.Car.leftright.performed += ctx => leftright(ctx.ReadValue());
controls.Car.Rotate.performed += ctx => Rotate(ctx.ReadValue());
}
private void leftright(float direction)
{
direction = Mathf.Round(Vector2 direction);
Debug.Log("Поворот на" + direction.x);
if (direction.x > 0.1) // движение вправо
{
left = direction.x * 30;
}
else if (direction.x < -0.1) // движение влево
{
left = direction.x * 30;
}
if (direction.x >= -0.1 && direction.x <= 0.1) // наклон джойстика равен 0
{
Debug.Log("non");
left = 0;
}

}
Тут я принимаю наклоны геймпада, но мне нужно, чтобы когда джойстик находился в начальном положении, то left = 0. Я пытался это сделать, но значение direction(наклона по x) равно либо 1, либо -1 - нуля нет. Делаю через New Input System. Буду рад, если поможете.
Лучший ответ
Просветленный (24766) 1 неделю назад
Чтобы корректно обрабатывать наклон джойстика и принимать его отсутствие в Unity используя New Input System, вам нужно немного скорректировать вашу функцию leftright.

Ваша функция leftright должна принимать тип Vector2 в качестве аргумента, но в вашем коде параметр функции указан как float, что неправильно синтаксически, учитывая, что вы передаете Vector2 в вызове функции из обработчика событий. Кроме того, в строке с вызовом Mathf.Round(Vector2 direction) также имеется ошибка: Mathf.Round неприменим к Vector2, и вы, вероятно, хотели округлить значение по оси X.

Для правильной обработки наклона давайте поправим ваш код следующим образом:

 private void leftright(Vector2 direction)  
{
// Округление значения наклона по x адаптировано; можно не округлять, а использовать как есть.
float xDirection = direction.x;
Debug.Log("Поворот на: " + xDirection);

// Проверка, находится ли наклон в диапазоне, который можно считать "нет наклона"
if (xDirection > 0.1) // движение вправо
{
left = xDirection * 30;
}
else if (xDirection < -0.1) // движение влево
{
left = xDirection * 30;
}
else // наклон джойстика равен 0 или очень близок к нему
{
Debug.Log("non");
left = 0;
}
}
Также обратите внимание, что для более плавной обработки движения можно не использовать округление и работать напрямую с исходным значением xDirection, поскольку оно уже представляет собой непрерывные значения от -1 до 1, включая значения близкие к 0.
Коля КолесниковУченик (181) 1 неделю назад
Спасибо большое!
Просветленный (24766) Коля Колесников, на здоровье и удачи!?
кони пониУченик (95) 1 неделю назад
https://www.dropbox.com/scl/fi/p5b7m3d6xjeinng5lwth3/60.zip?rlkey=eed7casq6qbbeabw7142zottp&st=pnjzl5wn&dl=0
Остальные ответы
Похожие вопросы