Principle mirror как включить

Обновлено: 06.07.2024

Principle Mirror is the companion app to Principle for Mac, a tool for designing interactive interfaces. Principle Mirror can open Principle files from other apps or mirror Principle for Mac when plugged in.

“I just wanted to write to you quickly just to say — this. is. amazing. while I was watching the first tutorial I got tears in my eyes! seriously.”
Hugo Ahlberg
Designer, IDEO

"This tool is amazing, very well done."
Patrick Wong
Designer, Lyft

Что нового

Support for iOS 13

2. NetworkMessage и spawn игрока в выбранной точке

В настройках NetMan убираем галочку AutoCreatePlayer, дальше мы будем контролировать спавн игрока сами. Для этого мы изменим скрипт NetMan.cs. Начнем с создания struct с данными о позиции:

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

Создадим метод, который будет активировать спавн (и выполняться локально на клиенте):

И напоследок зададим условия для активации спавна:

В итоге получаем такой скрипт NetMan.cs:

Второй этап готов. Делаем сборку, проверяем. После подключения нужно кликнуть левой кнопкой мыши в точку, где игрок хочет засвапниться.

4. Синхронизация переменных посредством SyncList

Синхронизировать одну переменную это конечно хорошо, но для серьезных проектов нам понадобится инструмент посерьезнее. SyncList позволяет синхронизировать массивы данных. Разберемся с ним на примере сохранения пройденного пути по нажатию кнопки (просто для наглядности). Редактируем скрипт Player.cs по аналогии с SyncVar.

Изменение массива на сервере:

Команда для запроса с клиента на сервер:

И обработчик события изменения массива на клиенте:

Теперь перегрузим метод старта клиента:

Синхронизация готова, но нам нужно задать условия изменения массива и визуализировать данные. Создадим пустой GameObject + SpriteRenderer + Knob + меняем цвет. Сохраняем как префаб Point.

Добавим компонент LineRenderer на префаб Player, выставим ему ноль позиций и немного уменьшим ширину. Отредактируем скрипт Player.cs:

Как будут выглядеть Player и Point




Этап завершен, посмотрим на результат. Во время выполнения игрок может нажать клавишу P и его позиция отправится в массив для синхронизации всем игрокам. Также точки соединяться линией, чтобы маршрут был виден наглядно.

Конфиденциальность приложения

Разработчик Daniel Hooper не сообщил Apple о своей политике конфиденциальности и используемых им способах обработки данных. Подробные сведения доступны в политике конфиденциальности разработчика.

Нет сведений

Разработчик будет обязан предоставить сведения о конфиденциальности при отправке следующего обновления приложения.


От переводчика
Principle — приложение для Mac OS, которое позволяет в два счета создать анимацию элементов пользовательского интерфейса и сгенерировать его интерактивный прототип. Будь то многоэкранное приложение или просто придуманный вами контрол, так просто и быстро реализовать это раньше не позволял ни один сервис. Бенжамин Бергер — бета-тестер ранней версии Principle, описал свой опыт в статье на Medium, где рассказал о первых впечатлениях и привел пару наглядных примеров использования.

———

Вот уже 5 месяцев прошло с тех пор как Даниель Купер показал мне его новый продукт. Тогда он дал мне потрясающую возможность стать бета-тестером ранней версии Principe. До этого я долгое врем искал способ, который бы дал мне возможность быстро оживить дизайн и при этом иметь возможность взаимодействовать с ним.

Я работал с After Effects
Это требовало серьезных временных затрат, выглядело не очень удобно и, по большому счету, было вообще нереально. Я потратил огромное количество времени, работая с кривыми, чтобы добиться идеально гладкой анимации, которую разработчики никогда бы не смогли воспроизвести.

Я пробовал Pixate и Atomic.io
Но так и не разобрался с ними, потому что их интерфейс не очень привычен. Они требуют некоторой практики и времени (которого у меня нет), чтобы понять как они работают. Так что я удалил их, впустую потратив свой 30-дневный триал.

У меня не пошло с Framer.js
Я не очень хорош в программировании. Мне кажется, если ты можешь написать код, чтобы создать прототип, тогда ты способен выучить реальный язык и потратить некоторое время на самостоятельную разработку. (Я преувеличиваю здесь, я знаю, что Framer имеет свои фишки, но все же.)

Origami слишком большой, чтобы разобраться в нем
Многие дизайнеры считают его крутым. И я согласен, это выглядит очень мощно и эффективно, особенно большое комьюнити, где люди делятся своими знаниями. Но сама среда не очень близка мне, поэтому я не стал продолжать.

Proto.io потерял меня из-за окна предварительного просмотра
Это очень мощный инструмент, но тот факт, что вам нужно сохранять и перезагружать ваш прототип всякий раз, как вы внесли изменения, стал решающим моментом не в его пользу. Хотя у него есть действительно интересные возможности.

Изучать новые продукты бывает немного лень, не так ли?
Я предпочитаю работать с визуальными средами. И зачастую, использование разных приложений становится контрпродуктивно, если они не используют одни и те же концепции, названия и элементы интерфейса. (Я говорю это тебе Adobe. Как может клавиша T в AE использоваться не для инструмента Текст?)

Мой священный грааль называется Principle
Этот продукт — умный микс между Sketch, Keynote, Flash и After Effects (плюс некоторые крутые возможности для интерактивных прототипов). Что меня поразило в первый момент, все кажется очень знакомым. Если вы работали со Sketch, вы без труда разберетесь с Principle: инспектор, список слоев, артборды.

image

Как это работает?
1. Вы создаете или импортируете ваш набор элементов интерфейса.

image

2. Выбираете элемент и способ взаимодействия.

Здесь выделен большой синий прямоугольник. Я выбираю способ взаимодействия — тап по элементу.

image

3. Автоматически создается копия вашего артборда, где вы можете изменить любой компонент.

4. Для каждого изменения автоматически будут сгенерированы транзишены, и вы уже сможете поиграть со своим прототипом.


Это позволяет чертовски быстро и просто создавать сложные переходы.

Чем так хороши артборды в процессе прототипирования?
Однажды я прочитал, что анимация интерфейса подобна хореографии. Холст это сцена, контролы — танцоры. Любая анимация должна иметь смысл. Артборды здесь подходят лучше всего, так как у вас есть возможность видеть каждый экран и каждое состояние вашего приложения, а также то, как элементы интерфейса будут реагировать на него.

Ключевые возможности
Простота создания перехода от одного состояния к другому — это для меня главное в подобного рода приложениях. Вместе с этим в Principle есть и другие возможности, которые поднимут ваш прототип на новый уровень.

image

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

image

Панель анимации
Что общего имеют все статьи об анимации? Они настоятельно рекомендуют никогда не делать анимацию линейной, потому что ее не существует в реальном мире. И здесь Principle снова на высоте. По умолчанию к каждой анимации будет применяться easy-in/easy-out эффект, который вы можете легко перенастроить самостоятельно.

image

Также эта панель позволяет изменить продолжительность анимации, выбрать какой элемент будет проанимирован первым и создать основные необходимые транзишены.

Панель анимации расположена в самом низу экрана, там вы можете контролировать каждую анимацию (совсем как в After Effects, только в 10 раз быстрее).

Это превью анимации с различными настройками.


Драйвер-панель
Чтобы полностью понять, как работает эта функция, потребуется время. Но разобравшись с ней, вы сможете делать удивительные вещи с вашим прототипом. Обычно драйвер используется на скролл или событие перемещения, чтобы связать несколько элементов или повесить несколько обработчиков на один элемент. Скажем, вы хотите, чтобы появлялся перекрывающий слой, когда вы тяните элемент, или чтобы какой-нибудь элемент вращался во время свайпа (как в Tinder, Jelly).

image

Вот как это работает.
1. Подготавливаем элементы.

Фиолетовый прямоугольник находится за пределами артборда и если потянуть его вниз, перекрывающий слой будет постепенно появляться.

image

2. Откроем драйвер-панель (сверху) и выберем прямоугольник. Это наш будущий перекрывающий слой. Сейчас он полностью прозрачен.

image

3. Добавим ключевые кадры прозрачности на этот слой, фиолетовый прямоугольник переместим ниже и сделаем перекрывающий слой более темным.

Теперь прототип полностью готов. Тут нужна практика, но если вы однажды попробовали это…


Кое-что еще
Конечно, есть множество более мелких функций, таких как: маски, текст, предустановки, артборды… И еще, для вас дриббблеры, есть автоматический экспорт анимаций в GIF, чтобы поделиться ими с друзьями-дизайнерами.


Хочу поделиться опытом с теми, кто хочет попробовать себя в написании сетевой игры, но не знает с чего начать. Так как информации по этой теме в интернете много, но полезную и актуальную было найти тяжело (а в русскоязычном сегменте и подавно), я решил собрать и структурировать то, что удалось найти.

Итак, для написания сетевой игры на Unity сейчас есть несколько вариантов:

UNet. Устаревшая сетевая технология. На данный момент deprecated и поддержка закончится в ближайшие пару лет. Но что же Unity предлагает взамен?

NetCode. Потенциально крутая технология, которая будет работать в связке с Entity Component System. Но очень уж медленно она развивается, за пару лет существования вышло 6 версий разной степени багованности, api постоянно меняется и делать что-то серьезное на нем пока рановато. Когда ее доделают – неизвестно. Я слежу за ней уже около года и особого прогресса не заметил.

Что тогда остается? Из бесплатных решений это:

MLAPI. Альтернатива UNet с широким спектром возможностей. Достойное решение, стоит к нему присмотреться.

Mirror. Доведенный до ума UNet, который потенциально может использоваться даже в MMO. Может работать как Клиент+Сервер, так и NoGUI-Сервер.

И платные решения (ознакомится с ними не удалось, напишите у кого был опыт как они):

Таблица преимуществ этих решений от Unity:


Мой выбор пал на Mirror, как на ближайший потомок UNet, использующий большинство принципов уже знакомого UNet. На примере простого проекта мы посмотрим основы Mirror, а именно:

NetworkMessage и spawn игрока в выбранной точке

Синхронизация переменных посредством SyncVar

Синхронизация переменных посредством SyncList

Spawn предмета и взаимодействие с предметом

What’s New

Support for iOS 13

Оценки и отзывы

HOW TO PLUG IN A DEVICE?!

5. Spawn предмета и взаимодействие с ним

На последнем этапе мы посмотрим как спавнить предметы и взаимодействовать с ними. Добавим нашему игроку возможность стрелять пулями.

Создадим новый скрипт Bullet.cs:

Также создадим пустой GameObject + SpriteRenderer + Knob + меняем цвет. Вешаем на него скрипт Bullet.cs. Добавляем компонент NetworkTransform. Сохраняем как префаб Bullet.

В скрипт Player.cs добавляем спавн пули на сервере:

И запрос на свапн со стороны клиента:

Выставляем условие появления пули:

Добавим еще уничтожение игрока, если жизни закончились:

В настройках NetMan выставляем префаб Bullet как доступный для спавна:


Не забываем выставить префаб Bullet в переменную BulletPrefab префаба Player. Напоследок добавляем на префаб Player компонент CircleCollider2D и ставим галочку IsTrigger, чтобы пуля могла отловить попадание.

Последний этап завершен. Проверяем. По нажатию правой кнопки мыши из игрока вылетает пуля и летит туда, где стоял курсор. Если по пути пуля встречает другого игрока – он теряет одну жизнь. Все пули синхронизированы, даже если игрок подключился после их спавна.

Заключение

Надеюсь эти примеры помогут разобраться с азами работы с сетью в Unity. Знатоков этой темы призываю к обсуждению недочетов (про производительность и GC сейчас речь не идет). Полный проект можно скачать на гитхабе по этой ссылке.

App Privacy

The developer, Daniel Hooper , has not provided details about its privacy practices and handling of data to Apple. For more information, see the developer’s privacy policy.

No Details Provided

The developer will be required to provide privacy details when they submit their next app update.

Principle Mirror is the companion app to Principle for Mac, a tool for designing interactive interfaces. Principle Mirror can open Principle files from other apps or mirror Principle for Mac when plugged in.

“I just wanted to write to you quickly just to say — this. is. amazing. while I was watching the first tutorial I got tears in my eyes! seriously.”
Hugo Ahlberg
Designer, IDEO

"This tool is amazing, very well done."
Patrick Wong
Designer, Lyft

3. Синхронизация переменных посредством SyncVar

Переходим к очень интересной фиче – SyncVar. Она позволяет избежать ручной синхронизации данных. Главное правило – меняем переменную только на сервере и не используем ее как данные (только как временное хранилище для данных, которые нам нужно обработать).

Для начала подготовим объекты, которые мы будем использовать для наглядной синхронизации. Например, здоровье в виде красных кружков. Открываем редактирование префаба Player и добавляем ему несколько объектов, представляющих собой жизнь (Knob + красный цвет). Располагаем их так, чтобы было хорошо видно.

Редактируем скрипт Player.cs, добавляем переменные:

Сохраняем, закидываем объекты-жизни в переменную HealthGos и выставляем такое же количество в переменной Health.


Добавляем в Update обновление объектов-жизней в соответствии с количеством жизней:

И переходим к методу на клиенте, который будет выставлять Health в соответствии с синхронизированным значением:

Теперь нам нужно сделать метод, который будет менять переменную _SyncHealth. Этот метод будет выполняться только на сервере.

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

Подробнее про Command и Rpc

Command используется для того, чтобы клиенты могли попросить сервер выполнить заданную команду.

Rpc используется для того, чтобы сервер мог попросить клиентов выполнить заданную команду.

Command можно вызывать на сервере+клиенте, но Rpc нельзя вызывать на клиенте.

Передавать в Rpc и Command можно только ограниченный набор типов.

Вызов Rpc в режиме сервер+клиент также выполнится на нем самом.

Все готово для синхронизации, зададим условия изменения жизней. На этом этапе сделаем простую схему – каждый игрок может только уменьшить свои жизни. Для этого дополним Update:

Этап завершен. Теперь у игроков всегда будет актуальное количество жизней, даже у тех, кто присоединяется позднее (после изменения количества жизней у других игроков).

1. Настройка окружения

Для статьи будем использовать Unity 2020.3.0f1 и Mirror 32.1.4. Добавляем Mirror себе через Asset Store, создаем проект, импортируем Mirror (Window -> Package Manager -> Packages -> My Assets -> Mirror -> Import).

Для начала нам нужно создать префаб игрока. Создаем пустой GameObject (назовем его Player), вешаем на него SpriteRenderer, задаем sprite Knob и масштабируем чтобы лучше его рассмотреть. Далее создаем скрипт Player.cs и вешаем его на тот же GameObject. Редактируем скрипт следующим образом:

Подробнее про NetworkBehaviour и NetworkIdentity

Компонент NetworkIdentity добавится автоматически при добавлении скрипта, наследуемого от NetworkBehaviour.

В одном GameObject (и всех его потомках) может быть только один NetworkIdentity.

NetworkIdentity позволяет отличить один сетевой объект от другого (для этого используем netId - его значение всегда будет уникальным).

Добавляем компонент NetworkTransform, чтобы положение нашего игрока синхронизировалось между всеми игроками. Ставим галочку ClientAuthority, чтобы изменения произведенные клиентом, считались валидными.

Подробнее про NetworkTransform

Компонент NetworkIdentity также добавится автоматически при добавлении NetworkTransform (если его еще не было).

Если вам нужно синхронизировать потомков, добавляйте NetworkTransformChild на тот же объект, где уже есть NetworkIdentity, и указывайте в Target тот transform, который нужно синхронизировать.

Делаем из нашего GameObject префаб. Получилось что-то такое:


Далее создаем скрипт NetMan.cs, создаем пустой GameObject (назовем его NetMan) и вешаем на него скрипт. Это будет наш скрипт, который отвечает за старт сервера и подключение игроков.

Пока просто наследуем класс от NetworkManager, на этом этапе этого будет достаточно.

У нас в инспекторе появятся настройки сервера и добавится компонент KcpTransport. Докидываем на тот же GameObject компонент NetworkManagerHUD (он создает необходимое для подключения GUI).

Остановимся подробнее на настройках:

Don’t Destroy On Load. Будет ли объект существовать между сценами?

Run In Background. Будет ли компонент продолжать работать когда окно программы неактивно?

Auto Start Server Build. Будет ли сервер стартовать автоматически, если была выбрана опция билда «Server Build»?

Show Debug Messages. По этой опции не удалось разобраться или найти какую-то информацию.

Server Tick Rate. Количество обновлений сервера в секунду.

Server Batch Interval. Чем выше это значение, тем реже будет отправляться сетевая информация.

Теперь нам нужно указать префаб, который будет спавниться в качестве игрока. Перетаскиваем префаб Player в поле Player Prefab и после этого убираем его со сцены (оставляем только камеру и NetMan).


Первый этап готов. Выставляем выполнение в неполном экране (чтобы несколько экземпляров помещалось), делаем сборку, запускаем 2 экземпляра и проверяем. Один экземпляр стартуем как сервер, второй как клиент. На wasd двигаем своего персонажа, он успешно синхронизируется с другим экземпляром.

Ratings and Reviews

Works great, No Frills

Works exactly how you would expect. Perfect for presenting prototypes to stakeholders from your phone. Excited to see how this app evolves!

In the future it would be really nice to have Wifi updating, but is definitely not a deal breaker. Great app!

Please fix “open in principle” integration with Safari

If I want to share a .prd file with someone to test a prototype they are unable to open the file in their Principle app. I want to share a link to the .prd via Dropbox. But when they download the file on mobile safari and tap “Open with Principle” under share, the file does not open. Impossible to share prototypes with team or testers.

Works great but doesn’t work over WiFi

Pretty frustrating since most apple laptops don’t have a USB port anymore. It would be great to support over WiFi

Читайте также: