Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Input на мобильных устройствах

На мобильных устройствах класс Input предлагает доступ к сенсорному экрану, акселерометру и вводу данных о географическом местоположении.

Доступ к клавиатуре на мобильных устройствах осуществляется через клавиатуру iOS.

Мультитач-экран

Устройства iPhone, iPad и iPod Touch способны отслеживать одновременное касание экрана пятью пальцами. Вы можете получить статус каждого пальца, касающегося экрана во время последнего кадра, обратившись к массиву свойств Input.touches.

У устройств Android нет единого ограничения на количество отслеживаемых пальцев. Вместо этого он зависит от устройства и может быть любым: от двух касаний на старых устройствах до пяти пальцев на некоторых новых устройствах.

Каждое касание пальца представлено структурой данных Input.Touch:

Свойства: Описание:
fingerId Уникальный индекс для прикосновения.
position Положение экрана касания.
deltaPosition Положение экрана изменилось с момента последнего кадра.
deltaTime Количество времени, прошедшее с момента последнего изменения состояния.
tapCount Экран iPhone/iPad способен распознавать быстрые касания пальца пользователя. Этот счетчик позволит вам узнать, сколько раз пользователь касался экрана, не перемещая палец в стороны. Устройства Android не считают количество нажатий, в этом поле всегда 1.
phase Описывает состояние касания, которое может помочь вам определить, начал ли пользователь касаться экрана, только что провел пальцем или просто поднял палец.
Began Просто палец коснулся экрана.
Moved Палец двигался по экрану.
Stationary Палец касается экрана, но не двигался с последнего кадра.
Ended Палец оторвался от экрана. Это завершающая фаза прикосновения.
Canceled Система отменила отслеживание касания, например, когда пользователь подносит устройство к лицу или одновременно происходит более пяти касаний. Это завершающая фаза прикосновения.

Вот пример скрипта, который запускает луч всякий раз, когда пользователь нажимает на экран:

using UnityEngine; public class TouchInput : MonoBehaviour { GameObject particle; void Update() { foreach(Touch touch in Input.touches) { if (touch.phase == TouchPhase.Began) { // Construct a ray from the current touch coordinates Ray ray = Camera.main.ScreenPointToRay(touch.position); if (Physics.Raycast(ray)) { // Create a particle if hit Instantiate(particle, transform.position, transform.rotation); } } } } }

Mouse simulation

Помимо встроенной сенсорной поддержки Unity iOSмобильная операционная система Apple. Подробнее
См. в Словарь
/Android обеспечивает имитацию мыши. Вы можете использовать функциональность мыши из стандартного класса Input. Обратите внимание, что устройства iOS/Android поддерживают касание несколькими пальцами. Использование функциональности мыши будет поддерживать только касание одним пальцем. Кроме того, касание пальцев на мобильных устройствах может перемещаться из одной области в другую без перемещения между ними. Симуляция мыши на мобильных устройствах обеспечит движение, поэтому она сильно отличается от сенсорного ввода. Рекомендуется использовать симуляцию мыши на ранних стадиях разработки, но использовать сенсорный ввод как можно раньше.

Акселерометр

По мере движения мобильного устройства встроенный акселерометр сообщает об изменениях линейного ускорения по трем основным осям в трехмерном пространстве. Аппаратное обеспечение напрямую сообщает об ускорении по каждой оси в виде значений G-force. Значение 1,0 соответствует нагрузке около +1 г вдоль заданной оси, а значение –1,0 соответствует –1 г. Если вы держите устройство в вертикальном положении (кнопка «Домой» внизу) перед собой, ось X направлена ​​вправо вправо, ось Y направлена ​​прямо вверх, а ось Z направлена ​​к вам.

Вы можете получить значение акселерометра, обратившись к свойству Input.acceleration.

Ниже приведен пример скрипта, который будет перемещать объект с помощью акселерометра:

using UnityEngine; public class Accelerometer : MonoBehaviour { float speed = 10.0f; void Update() { Vector3 dir = Vector3.zero; // we assume that the device is held parallel to the ground // and the Home button is in the right hand // remap the device acceleration axis to game coordinates: // 1) XY plane of the device is mapped onto XZ plane // 2) rotated 90 degrees around Y axis dir.x = -Input.acceleration.y; dir.z = Input.acceleration.x; // clamp acceleration vector to the unit sphere if (dir.sqrMagnitude > 1) dir.Normalize(); // Make it move 10 meters per second instead of 10 meters per frame... dir *= Time.deltaTime; // Move object transform.Translate(dir * speed); } }

Фильтр нижних частот

Показания акселерометра могут быть прерывистыми и шумными. Применение низкочастотной фильтрации к сигналу позволяет сгладить его и избавиться от высокочастотного шума.

Следующий скрипт показывает, как применить низкочастотную фильтрацию к показаниям акселерометра:

using UnityEngine; public class LowPassFilterExample : MonoBehaviour { float accelerometerUpdateInterval = 1.0f / 60.0f; float lowPassKernelWidthInSeconds = 1.0f; private float lowPassFilterFactor; private Vector3 lowPassValue = Vector3.zero; void Start() { lowPassFilterFactor = accelerometerUpdateInterval / lowPassKernelWidthInSeconds; lowPassValue = Input.acceleration; } private void Update() { lowPassValue = LowPassFilterAccelerometer(lowPassValue); } Vector3 LowPassFilterAccelerometer(Vector3 prevValue) { Vector3 newValue = Vector3.Lerp(prevValue, Input.acceleration, lowPassFilterFactor); return newValue; } }

Чем больше значение LowPassKernelWidthInSeconds, тем медленнее отфильтрованное значение будет приближаться к текущему входному образцу (и наоборот).

Мне нужна максимальная точность показаний акселерометра. Что мне делать?

Чтение переменной Input.acceleration не означает выборку оборудования. Проще говоря, Unity сэмплирует аппаратное обеспечение с частотой 60 Гц и сохраняет результат в переменной. В реальности все немного сложнее — выборка акселерометра не происходит через равные промежутки времени при значительных нагрузках на ЦП. В результате система может сообщить о 2 выборках в течение одного кадра, а затем об 1 выборке в следующем кадре.

Вы можете получить доступ ко всем измерениям, выполненным акселерометром во время кадра. Следующий код иллюстрирует простое среднее значение всех событий акселерометра, собранных в последнем кадре:

public class AccelerationEvents : MonoBehaviour { void Update() { GetAccelerometerValue(); } Vector3 GetAccelerometerValue() { Vector3 acc = Vector3.zero; float period = 0.0f; foreach(AccelerationEvent evnt in Input.accelerationEvents) { acc += evnt.acceleration * evnt.deltaTime; period += evnt.deltaTime; } if (period > 0) { acc *= 1.0f / period; } return acc; } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3