- Продвинутый скриптинг в Unity для мобильных платформ
- Свойства устройства.
- Проверка на пиратство
- Поддержка вибрации
- Индикатор активности
- Ориентация Экрана
- Продвинутый Android скриптинг
- Определение поколения устройства
- Как запретить вращение экрана?
- Решение
- Ввод на мобильном устройстве
- Multi-Touch Screen
- Симуляция Мыши
- Акселерометр
- Фильтр низких частот
- Я хочу получить как можно более точные показания акселерометра. Что я должен делать?
- Нужно в Unity3d протестировать как программа будет себя вести при повороте экрана телефона. Как это сделать в самом редакторе Unity?
- Повороты экрана в Android без боли
- Предисловие
- Когда начались проблемы?
- Возможное решение
- Да начнется магия
- Реализация приложения
Продвинутый скриптинг в Unity для мобильных платформ
Свойства устройства.
Можно получить доступ к специфичным для устройств свойствам. Изучите следующие страницы справки SystemInfo.deviceUniqueIdentifier, SystemInfo.deviceName, SystemInfo.deviceModel и SystemInfo.operatingSystem.
Проверка на пиратство
Нарушители авторского права часто взламывают приложения (достаточно снять DRM защиту AppStore) и затем распространяют их бесплатно. Unity предоставляет способ проверки на пиратство, который позволяет вам определить, было ли изменено приложение после его отправки в AppStore.
Вы можете проверить ваше приложение на подлинность(не взломано) с помощью свойства Application.genuine. Если это свойство возвращает false , следовательно вы можете уведомить пользователя о том, что он использует взломанное приложение или отключить доступ к некоторым функциям в вашем приложении.
Примечание: Application.genuineCheckAvailable может быть использован вместе с Application.genuine для проверки на то, подтверждена ли целостность приложения. Доступ к свойству Application.genuine — довольно дорогая операцию, поэтому не рекомендуется делать это в часто вызываемых фрагментах кода (в функции Update и т.д.).
Поддержка вибрации
Для вызова вибрации можно использовать Handheld.Vibrate. Устройства, лишенные поддержки вибрации, будут просто игнорировать этот вызов.
Индикатор активности
Мобильные ОС имеют встроенные индикаторы активностей, можете их использовать во время медленных операций. В качестве примера, используйте Handheld.StartActivityIndicator docs.
Ориентация Экрана
Unity iOS/Android позволяет вам управлять текущей ориентацией экрана. Обнаружение изменения ориентации или фиксирование некоторых специфических ориентаций может быть полезно если вы хотите сделать игровое поведение зависящим от того, как пользователь держит устройство.
Чтобы получить ориентацию устройства, нужно получить доступ к свойству Screen.orientation. Ориентации могут быть следующими:
Portrait | Устройство в портретном режиме, удерживающееся в вертикальном положении. Кнопка “домой” расположена снизу. |
PortraitUpsideDown | Устройство в портретном режиме, но “вверх ногами”, удерживающееся в вертикальном положении. Кнопка “домой” расположена сверху. |
LandscapeLeft | Устройство в ландшафтном режиме, удерживающееся в вертикальном положении. Кнопка “домой” расположена справа. |
LandscapeRight | Устройство в ландшафтном режиме, удерживающееся в вертикальном положении. Кнопка “домой” расположена слева. |
Для установки одного из этих ориентаций, используйте Screen.orientation. Или используйте авто-вращение ScreenOrientation.AutoRotation. При использовании авто-вращения, можно индивидуально отключить некоторые ориентации. Для этого см. Screen.autorotateToPortrait, Screen.autorotateToPortraitUpsideDown, Screen.autorotateToLandscapeLeft andScreen.autorotateToLandscapeRight
Продвинутый Android скриптинг
Определение поколения устройства
Различные android устройства имеют разный функционал и очень варьируются в производительности. Вам нужно ориентироваться на конкретные устройства (или семейства устройств), чтобы решить, какие функции нужно отключить для компенсации медленных устройств. Есть ряд специфических свойств, к которым вы можете обратится в зависимости от используемого устройства.
Примечание: Рынок android приложений делает дополнительную фильтрацию совместимости, поэтому вы не должны беспокоится если ваше ARMv7-only приложение, оптимизированное для OGLES2, предлагается некоторым старым медленным устройствам.
Источник
Как запретить вращение экрана?
Запретить объекту выходить за камеру(границу экрана)
Игра 2D, Границы камеры и есть граница экрана, как запретить объекту которым управляет игрок(WASD).
Удаленный просмотр экрана — как запретить?
Вводная часть — если интересно Пишу в эту тему т.к. задача общая, без привязки к конкретному.
Как запретить эллементу уезжать за область экрана
Всем привет. У меня есть блок, в котором находится табличка. Этот самый блок адаптируется под.
Как запретить задвигать форму за края экрана?
Нужно запретить задвигать форму за край экрана. Вот я побывал для левой стороны: If Location.X 1
Решение
Как запретить дочернему блоку выходить за границы экрана
Добавил на страницу сплитер, чтобы изменять ширину блоков. С левым блоком все хорошо, но когда.
Как запретить поддержку устройств с определённым размером экрана?
Как запретить поддержку устройств с определённым размером экрана? пробовал.
Как запретить масштабирование контролов на форме при изменении dpi экрана?
Всем здравствуйте. Речь об отсутствующем свойстве Scaled у форм студии. (В Delphi эта проблема.
Как запретить\заблокировать приложению, запускаемому от админа, снимать скрин с экрана?
Уважаемые программисты, администраторы! Вопрос. Есть ли практическая или теоретическая возможность.
Вращение закрашенного пятиугольника в центре экрана с изменением цвета
Тема- Объектное ориентирование в среде турбо паскаль. Задача — Вращение закрашенного пятиугольника.
Реализовать вращение 3D объекта как вращение камеры
Существует некий объект в 3D пространстве (для примера используем куб). В исходном положении это.
Источник
Ввод на мобильном устройстве
На мобильных устройствах класс Input предоставляет доступ к нажатию на экран, акселерометру и географическим/локационным данным.
Доступ к клавиатуре на мобильных устройствах обеспечивается через iOS keyboard.
Multi-Touch Screen
iPhone и iPod способны отслеживать до пяти нажатий на экран одновременно. Вы можете получить статус каждого нажатия на протяжении последнего кадра через массив Input.touches.
Android устройства не имеют определенного лимита на количество нажатий, которое можно отслеживать. Он колеблется от устройства к устройству и может варьироваться от одного-двух нажатий на старых устройствах, до пяти нажатий на некоторых новых.
Каждое нажатие пальцем представлено в структуре данных Input.Touch:
Свойство: | Функция: |
---|---|
fingerId | Уникальный индекс для нажатия. |
position | Позиция нажатия на экран. |
deltaPosition | Изменение позиции на экране с последнего кадра. |
deltaTime | Количество времени, которое прошло с тех пор как изменилось последнее состояние. |
tapCount | The iPhone/iPad screen is able to distinguish quick finger taps by the user. This counter will let you know how many times the user has tapped the screen without moving a finger to the sides. Android devices do not count number of taps, this field is always 1. |
phase | Describes so called “phase” or the state of the touch. It can help you determine if the touch just began, if user moved the finger or if they just lifted the finger. |
Фазы могут быть следующими:
Began | Палец только что прикоснулся к экрану. |
Moved | Палец передвинулся по экрану. |
Stationary | Палец прикоснулся к экрану, но с последнего кадра не двигался. |
Ended | Палец только что оторван от экрана. Это последняя фаза нажатий. |
Canceled | The system cancelled tracking for the touch, as when (for example) the user puts the device to their face or more than five touches happened simultaneously. This is the final phase of a touch. |
Ниже приведен пример скрипта, который выпускает луч там, где пользователь тапает по экрану:
Симуляция Мыши
On top of native touch support Unity iOS/Android provides a mouse simulation. You can use mouse functionality from the standard Input class. Note that iOS/Android devices are designed to support multiple finger touch. Using the mouse functionality will support just a single finger touch. Also, finger touch on mobile devices can move from one area to another with no movement between them. Mouse simulation on mobile devices will provide movement, so is very different compared to touch input. The recommendation is to use the mouse simulation during early development but to use touch input as soon as possible.
Акселерометр
При движении мобильных устройств, встроенный акселерометр сообщает линейное ускорение изменяется вдоль трех основных осей в трехмерном пространстве. Ускорение вдоль каждой оси сообщается непосредственно аппаратным обеспечением как значение G-Force. Значение 1,0 представляет собой нагрузку около +1г вдоль заданной оси, а величина –1,0 представляет –1g. Если вы держите устройство в вертикальном положении (с кнопкой “домой” внизу) перед собой, ось X (положительная) будет по правой стороне, ось Y (положительная) будет направлена вверх, а ось Z (положительная) будет указывать на вас.
Вы можете получить значение акселерометра, путем доступа к свойству Input.acceleration.
Приведенный ниже пример скрипта позволяет двигать объект, используя акселерометр:
Фильтр низких частот
Показания акселерометра могут быть отрывистыми и с шумом. Применив низкочастотную фильтрацию на сигнал, вы сгладите его и избавитесь от высокочастотного шума.
Приведенный ниже скрипт демонстрирует, как применить низкочастотную фильтрацию на показания акселерометра:
Чем больше значение LowPassKernelWidthInSeconds , тем медленнее фильтруется значение, которое будет приближаться к значению входного образца (и наоборот).
Я хочу получить как можно более точные показания акселерометра. Что я должен делать?
Чтение переменной Input.acceleration не означает дискретизацию. Проще говоря, Unity замеряет результат при частоте 60 Гц. и сохраняет его в переменную. На самом деле все немного сложнее — в случае значительной нагрузки на процессор, замеры акселерометра не происходят с постоянными временными интервалами. В результате, система может сделать два замера за один кадр, и один замер за следующий кадр.
Вы можете получить доступ ко всем замерам, выполненным акселерометром в текущем кадре. Следующий код иллюстрирует простое среднее всех событий акселерометра, которые были собраны в течение последнего кадра:
Источник
Нужно в Unity3d протестировать как программа будет себя вести при повороте экрана телефона. Как это сделать в самом редакторе Unity?
Вот допустим такой код см. ниже.
Как бы я не менял в окне Game разрешение экрана, все равно выводит Portrait.
if(Screen.orientation == ScreenOrientation.Portrait)
<
if(Screen.orientation == ScreenOrientation.Portrait)
<
print(«P»);
>
if(Screen.orientation == ScreenOrientation.PortraitUpsideDown)
<
print(«PUD»);
>
if(Screen.orientation == ScreenOrientation.Landscape)
<
print(«L»);
>
if(Screen.orientation == ScreenOrientation.LandscapeRight)
<
print(«LR»);
> print(«P»);
>
if(Screen.orientation == ScreenOrientation.PortraitUpsideDown)
<
print(«PUD»);
>
if(Screen.orientation == ScreenOrientation.Landscape)
<
print(«L»);
>
if(Screen.orientation == ScreenOrientation.LandscapeRight)
<
print(«LR»);
>
- Вопрос задан более трёх лет назад
- 393 просмотра
Сделайте публичный параметр:
public ScreenOrientation editorOrientation;
А в начале портянки с if сделайте так:
Тогда сможете в любой момент менять ориентацию как захотите.
Ещё можете попробовать поиграться с PlayerSettings.defaultInterfaceOrientation, может быть он обновляет в рантайме Screen.orientation.
мдя. сделал как Вы написали, переключал вручную. Результата нет. Переключение не происходит.
public ScreenOrientation editorOrientation;
Источник
Повороты экрана в Android без боли
Важно!
Изначально в статье была реализация с ошибкой. Ошибку исправил, статью немного поправил.
Предисловие
Истинное понимание проблем каждой платформы приходит после того, как попробуешь писать под другую платформу / на другом языке. И вот как раз после того, как я познакомился с разработкой под iOS, я задумался над тем, насколько ужасна реализация поворотов экрана в Android. С того момента я думал над решением данной проблемы. Попутно я начал использовать реактивное программирование везде, где только можно и уже даже не представляю как писать приложения по-другому.
И вот я узнал про последнюю недостающую деталь — Data Binding. Как-то эта библиотека прошла мимо меня в свое время, да и все статьи, что я читал (что на русском, что на английском) рассказывали не совсем про то, что мне было необходимо. И вот сейчас я хочу рассказать про реализацию приложения, когда можно будет забыть про повороты экранов вообще, все данные будут сохраняться без нашего прямого вмешательства для каждого активити.
Когда начались проблемы?
По настоящему остро я почувствовал проблему, когда в одном проекте у меня получился экран на 1500 строк xml, по дизайну и ТЗ там было целая куча различных полей, которые становились видимыми при разных условиях. Получилось 15 различных layout’ов, каждый из которых мог быть видимым или нет. Плюс к этому была еще куча различных объектов, значения которых влияют на вьюху. Можете представить уровень проблем в момент поворота экрана.
Возможное решение
Сразу оговорюсь, я против фанатичного следования заветам какого-либо подхода, я пытаюсь делать универсальные и надежные решения, несмотря на то, как это смотрится с точки зрения какого-либо паттерна.
Я назову это реактивным MVVM. Абсолютно любой экран можно представить в виде объекта: TextView — параметр String, видимость объекта или ProgressBar’а — параметр Boolean и т.д… А так же абсолютно любое действие можно представить в виде Observable: нажатие кнопки, ввод текста в EditText и т.п…
Вот тут я советую остановиться и прочитать несколько статей про Data Binding, если еще не знакомы с этой библиотекой, благо, на хабре их полно.
Да начнется магия
Перед тем как начать создавать нашу активити, создадим базовые классы для активити и ViewModel’ли, где и будет происходить вся магия.
Update!
После общения в комментариях, осознал свою ошибку. Суть в том, что в моей первой реализации ничего не сериализуется, но все работает при поворотах экрана, да даже при сворачивании, разворачивании экрана. В комментариях ниже обязательно почитайте почему так происходит. Ну а я исправлю код и поправлю комментарии к нему.
Для начала, напишем базовую ViewModel:
Я уже говорил, что все что угодно можно представить как Observable? И библиотека RxBinding отлично это делает, но вот беда, мы работает не напрямую с объектами, типа EditText, а с параметрами типа ObservableField. Что бы радоваться жизни и дальше, нам необходимо написать функцию, которая будет делать из ObservableField необходимый нам Observable RxJava2:
Тут все просто, передаем на вход ObservableField и получаем Observable RxJava2. Именно для этого мы наследуем базовый класс от BaseObservable. Добавим этот метод в наш базовый класс.
Теперь напишем базовый класс для активити:
Я постарался подробно прокомментировать код, но заострю внимание на нескольких вещах.
Активити, при повороте экрана всегда уничтожается. Тогда, при восстановлении снова вызывается метод onCreate. Вот как раз в методе onCreate нам и нужно восстанавливать данные, предварительно проверив, сохраняли ли мы какие-либо данные. Сохранение данных происходит в методе onSaveInstanceState.
При повороте экрана нас интересует порядок вызовов методов, а он такой (то, что интересует нас):
1) onDestroy
2) onSaveInstanceState
Что бы не сохранять уже не нужные данные мы добавили проверку:
Дело в том, что метод isFinishing вернет true только если мы явно вызвали метод finish() в активити, либо же ОС сама уничтожила активити из-за нехватки памяти. В этих случаях нам нет необходимости сохранять данные.
Реализация приложения
Представим условную задачу: нам необходимо сделать экран, где будет 1 EditText, 1 TextView и 1 кнопка. Кнопка не должна быть кликабельной до тех пор, пока пользователь не введет в EditText цифру 7. Сама же кнопка будет считать количество нажатий на нее, отображая их через TextView.
Update!
Пишем нашу ViewModel:
Update
Вот тут и и были самые большие проблемы. Все работало и при старой реализации, ровно до того момента, пока в настройках разработчика не включить параметр «Don’t keep activities».
Что бы все работало как надо, необходимо реализовывать интерфейс Parcelable для ViewModel. По поводу реализации ничего писать не буду, только уточню еще 1 момент:
Данные-то мы возвращаем, а вот Observable мы теряем. Поэтому пришлось выводить в отдельный метод и вызывать его во всех конструкторах. Это очень быстрое решение проблемы, не было времени подумать лучше, нужно было было указать на ошибку. Если у кого-то есть идеи как реализовать это лучше, пожалуйста, поделитесь.
Теперь напишем для этой модели view:
Ну и теперь, мы пишем нашу активити:
Запускаем приложение. Кнопка не кликабельна, счетчик показывает 0. Вводим цифру 7, вертим телефон как хотим, через 2 секунды, в любом случае кнопка становится активной, тыкаем на кнопку и счетчик растет. Стираем цифру, вертим телефоном снова — кнопка все равно через 2 секунды будет не кликабельна, а счетчик не сбросится.
Все, мы получили реализацию безболезненного поворота экрана без потери данных. При этом будут сохранены не только ObservableField и тому подобные, но так же и объекты, массивы и простые параметры, типа int.
Источник