Реализуем multi- touch жесты самостоятельно / Статьи / Unity. D / Сообщества / Game. Dev. ru — Разработка игр. Автор: Skyblade. В этой статье будет рассмотрена реализация pan (перемещения) и pinch zoom (масштабирования двумя пальцами) изображения. В результате получится некий аналог приложения для просмотра фотографий.
Часть первая (с картинками). Подготовка. Часть вторая. Код. Перемещение. Масштабирование. Часть первая (с картинками). Подготовка. Создадим новый проект и настроим камеру на ортогональную проекцию (свойство Projection = Orthographic). Компоненты GUILayer, Flare Layer и Audio Listener можно отключить или вообще удалить за ненадобностью.
После этого сохраним нашу сцену (Ctrl+S), назвав её как- нибудь, например, Main. Scene. unity. В итоге экран редактора дожен выглядеть примерно так. Показать– Скрыть. Теперь зададим режим отрисовки объектов (если в игре не будет ничего, кроме спрайтов). Edit - > Project Settings - > Player - > Other settings - > Rendering - > Rendering Path = Vertex Lit.
Нам нужно создать какой- то объект, который будет отображаться на экране, чтобы мы видели, как он двигается. Для этой цели могла бы подойти плоскость (Game Object - > Create Other - > Plane), но она состоит из 4. Поэтому воспользуемся скриптом отсюда http: //wiki. Create. Plane. Создадим папку Editor в папке Assets и добавим туда новый файл Create.
. Недавно, при разработке игры под Android, я столкнулся с проблемой. в себе все касания с актуальными и предыдущими координатами. в качестве истории касаний мы получим промежуточные точки.
Plane. cs, текст которого можно найти по ссылке выше. После этого в меню появится новый пункт Game. Object - > Create Other - > Custom Plane.. Создадим новую плоскость с такими параметрами. На экране появится розовый квадрат - это наш нетекстурированный объект. Добавим какую- нибудь картинку в папку Assets, создадим для него новый материал и установим для него текстурой только что добавленное изображение. Для материала поставим шейдер Unlit/Texture.
Показать– Скрыть. Наконец, установим материал для объекта. Показать– Скрыть. Теперь у нас есть неподвижный объект на экране, и нам нужно написать код, который будет двигать камеру. Часть вторая. Код. Создадим новый файл с текстом скрипта под названием Camera. Script и добавим его к Main.
Camera (перетянем в окно Hierarchy на Main. Camera). Затем запишем в него такой текст. Показать– Скрытьusing Unity. Engine. using System. Collections. publicclass Camera. Script : Mono. Behaviour. Vector. 3 initial.
Второй урок рассказывает о работе с графикой в Android через класс Canvas. по нему и переместить в точку, соответствующую координатам касания.
Второй урок рассказывает о работе с графикой в Android через класс Canvas по нему и переместить в точку, соответствующую координатам касания. Package ru.startandroid.develop.p1021touch; import android.app. В случае ACTION_MOVE пишем в sMove координаты точки текущего. . package ru.startandroid.develop.p1021touch; import android.app. В случае ACTION_MOVE пишем в sMove координаты точки текущего .
Touch. Position. // мировые координаты камеры при инициировании// перемещения/масштабированияprivate Vector. Camera. Position. Vector. 3 initial. Touch. 0Position.
Vector. 3 initial. Touch. 1Position. Vector. 3 initial.
Mid. Point. Screen. Orthographic. Size. Use this for initializationvoid Start(). Update is called once per framevoid Update(). Input. touch. Count == 1).
Touch touch. 0 = Input. Get. Touch(0). if(Is. Touching(touch. 0)). Touch. Position = touch. Camera. Position = this.
Vector. 2 delta = camera. Screen. To. World. Point(touch. 0. position) - . Screen. To. World. Point(initial. Touch. Position). Vector.
Pos = initial. Camera. Position. new. Pos.
Pos. y - = delta. Pos. }. if(! Is. Touching(touch. Input. touch. Count == 2). Touch touch. 0 = Input. Get. Touch(0). Touch touch. Input. Get. Touch(1).
Touch. 0Position = touch. Touch. 1Position = touch. Camera. Position = this. Orthographic. Size = Camera.
Size. initial. Mid. Point. Screen = (touch. Camera. Position. Size = initial. Orthographic. Size. float scale.
Factor = Get. Scale. Factor(touch. 0. position. Touch. 0Position. Touch. 1Position).
Vector. 2 current. Mid. Point = (touch. Vector. 3 initial. Point. World. Before. Zoom = camera. Screen.
To. World. Point(initial. Mid. Point. Screen).
Camera. main. orthographic. Size = initial. Orthographic. Size / scale. Factor.
Vector. 3 initial. Point. World. After. Zoom = camera. Screen.
To. World. Point(initial. Mid. Point. Screen). Vector. 2 initial.
Point. Delta = initial. Point. World. Before. Zoom - initial. Point. World. After. Zoom.
Vector. 2 old. And. New. Point. Delta =. Screen. To. World.
Point(current. Mid. Point) - . camera. Screen. To. World.
Point(initial. Mid. Point. Screen). Vector. Pos = initial. Camera. Position. new. Pos.
And. New. Point. Delta. Point. Delta. x. new. Pos. y - = old. And.
New. Point. Delta. Point. Delta. y. this. Pos. zoom = false. Is. Touching(Touch touch).
Touch. Phase. Began ||. Touch. Phase. Moved ||. Touch. Phase. Stationary. Get. Scale. Factor(Vector. Vector. 2 position. Vector. 2 old. Position. Vector. 2 old. Position.
Vector. 2. Distance(position. Distance = Vector. Distance(old. Position. Position. 2). if(old. Distance == 0 || distance == 0). Distance. }Перемещение. Сначала рассмотрим вариант с перемещением.
Для него нам нужен. Touch. Position, которая хранит начальные экранные координаты точки касания экрана пальцем. Camera. Position в момент первоначального касания пальцем экрана. Код для перемещения камеры одним пальцем очень прост. Для начала проверяем, что экрана касается только один палец. Input. touch. Count == 1).
Внутри первым делом отменяем операцию масштабирования, чтобы она не мешала коду перемещения, и получаем экранные координаты точки касания. Touch touch. 0 = Input. Get. Touch(0). Если это первый кадр, который инициирует перемещение, то устанавливаем соответствующий флаг и запоминаем координаты точки касания и текущих координаты камеры. Touch. Position = touch. Camera. Position = this. Если же это последующие после начала касания кадры, то мы определяем, насколько сместился палец относительно начальной точки касания и перемещаем камеру в обратную сторону, чтобы скомпенсировать это движение, и объект под пальцем остался в той же точке.
Pos = initial. Camera. Position. new. Pos. Pos. y - = delta. Pos. }Масштабирование. Код для двуточечного масштабирования немного сложнее.
Как и в прошлый раз, сначала проверяем, что экрана касается 2 пальца. Input. touch. Count == 2). Затем отменяем операцию перемещения и получаем экранные координаты обеих точек касания. Touch touch. 0 = Input.
Get. Touch(0). Touch touch. Input. Get. Touch(1). Для первого кадра, в котором экрана касаются оба пальца одновременно, нужно запомнить 5 переменных. Touch. 0Position и initial. Touch. 1Positionб) 1 мировые координаты камеры initial. Camera. Position в момент первоначального касания пальцев экрана.
Orthographic. Sizeг) 1 координаты точки initial. Mid. Point. Screen посередине точек касания. Каждый последующий кадр сбрасываем координаты камеры и её "размер" к значениям на момент первоначального касания обеих пальцев экрана для того, чтобы каждый следующий кадр не накапливались изменения в положении/размере камеры. Camera. Position. Size = initial. Orthographic.
Size. Затем находим, во сколько раз увеличивать или уменьшать размер области вывода камеры. Это значение есть отношение длины отрезка, образованного расположением пальцев на текущем кадре, к длине отрезка, образованного расположением пальцев на первом кадре. Factor = Get. Scale. Factor(touch. 0. position. Touch. 0Position. Touch. 1Position). Далее находим среднюю точку между двумя пальцами на текущем кадре.
Vector. 2 current. Mid. Point = (touch. Следующие 4 строки вычисляют разницу в мировых координатах средней точки касания после изменения размера камеры, так как при изменении размера экранные координаты средней точки остаются неизменными, а мировые могут поменяться, так как масштабирование камеры всегда происходит относительно центра экрана. Vector. 3 initial. Mid. Point. World. Before. Zoom = camera.
Screen. To. World. Point(initial. Mid. Point. Screen). Camera. Size = initial. Orthographic. Size / scale. Factor. Vector. 3 initial.
Mid. Point. World. After. Zoom = camera. Screen. To. World.
Point(initial. Mid. Point. Screen). Vector. Mid. Point. Delta = initial. Mid. Point. World. Before. Zoom - initial. Mid. Point. World.
After. Zoom. Наконец, вычисляем между мировыми координатами средней точки на текущем и первом. Vector. 2 old. And. New. Mid. Point. Delta =.
Screen. To. World. Point(current. Mid.
Point) - . camera. Screen. To. World. Point(initial. Mid. Point. Screen). и корректируем положение камеры, учитывая все поправки. Vector. 3 new. Pos = initial.
Camera. Position. Pos. x - = old. And. New. Mid. Point. Delta. Mid. Point. Delta.
Pos. y - = old. And. New. Mid. Point. Delta. Mid. Point. Delta.
Pos; В качестве побочного эффекта код двуточечного масштабирования отвечает так же и за перемещение камеры, и, если расстояние между пальцами не меняется, сводится к коду для перемещения камеры одним пальцем. Хотя код прверялся только на Android, он должен работать без изменений и на i. OS. Исходный код можно скачать по адресу https: //github. Skybladev. 2/Unity. D- pan- and- zoom- example.
Готовое приложение для Android можно скачать отсюда: http: //rghost. Android, #i. OS, #multitouch, #pan, #pinch, #zoom. Обновление: 2. 9 ноября 2.