Перейти к основному содержимому

Нужен Unity 2020.3 или новее · Бесплатно

Getly Publisher для Unity

Пакет для редактора Unity. Проверяет папку ассета, которую вы собираетесь продавать, и отправляет карточку черновиком, не выходя из редактора. Он бесплатный, и это первый товар, который Getly опубликовал для себя.

Проблема, в цифрах

.unitypackage непрозрачен до момента импорта, а это уже поздно. Этот инструмент существует ради одного конкретного сбоя: покупатель открывает демо-сцену, и на каждом объекте написано «Missing (Mono Script)», потому что автор тестировал его в единственном проекте, где эти скрипты случайно были. Когда мы начинали, на Getly было 48 файлов .unitypackage в 8 магазинах, и ни один из них никогда и ничем не читался.

Каждое решение и чего оно стоило

01

Проверка идёт дважды, и решает только одна половина

Почему

Внутри редактора видно то, чего не увидит ни один сервер: резолвится ли на самом деле GUID скрипта в префабе, какие у текстуры настройки импорта, как компилятор читает файл. Но работает он на машине продавца, в пакете, который тот может изменить. Доверять его отчёту значило бы, что гейт — это то, что скажет копия нашего кода на чужом компьютере. Поэтому редактор советует, а решает Getly, читая загруженные байты.

Чего это стоило

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

02

Шесть проверок блокируют публикацию. Десять — никогда.

Почему

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

Чего это стоило

Пять из шести сервер находит сам. Шестая — префаб, ссылающийся на скрипт, которого в пакете нет, та самая, с которой начинается весь этот инструмент, — требует редактора, потому что разрешить GUID умеет только Unity. Продавец, идущий путём без установки, получает остальные пять и не получает эту, и мы предпочтём сказать об этом прямо, чем позволить этому пути намекать на обратное.

03

Гейт смотрит на расширение файла и больше ни на что

Почему

Проверка Unity смотрит на расширение и больше ни на что, поэтому отказать она может только .unitypackage: все карточки, существовавшие на момент её выхода, не затронуты, и продавцу чего угодно, кроме работ для Unity, не пришлось учить наше новое правило. Это уже не весь гейт — появившаяся позже проверка Blender вынуждена открывать архивы, — но половина, отвечающая за Unity, по-прежнему трогает только Unity.

Чего это стоило

Ассет Unity, приехавший внутри .zip, не покрыт. Мы приняли это, вместо того чтобы гейт начал иметь мнение о сотнях архивов, судить которые не его дело.

04

Пройти его можно, ничего не устанавливая

Почему

Гейт срабатывает при переходе товара в продажу, а продавцы с живыми ассетами Unity были задолго до появления инструмента. Сделать установку единственным путём значило бы, что продавец, торгующий здесь месяцами, обязан скачать пакет для редактора, чтобы опубликовать обновление. Поэтому та же проверка запускается со страницы редактирования товара.

Чего это стоило

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

05

Ключ API лежит в настройках редактора и никогда — в проекте

Почему

Ключ, лежащий рядом с вашей работой, — это ключ, который однажды попадёт внутрь пакета и будет продан. Настройки редактора находятся вне папки, которую вы упаковываете, поэтому уехать вместе с ассетом по случайности он не может.

Чего это стоило

Настройки редактора привязаны к машине и к пользователю ОС, а не к проекту, и ключ лежит там в открытом виде. Продавец на второй машине входит заново, а любой, у кого есть эта учётная запись ОС, оказывается вошедшим как этот магазин. Мы предпочли это ключу, который можно экспортировать внутрь пакета и продать.

В чём мы сначала ошиблись

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

Мы написали

«Каждый ассет Unity на Getly проверяется, прежде чем попасть в продажу.»

Правда

Неправда, и написали мы это на странице, весь смысл которой в том, что мы всё проверяем. Гейт срабатывает при переходе в продажу, поэтому 48 файлов .unitypackage, уже прикреплённых по каталогу, не читались никогда. Мы переписали это на «начиная с этого момента» ещё до выпуска и добавили отдельный счётчик того, сколько прочитано на самом деле, — сегодня 1.

Для вашей карточки

Абсолютные слова — каждый, всегда, полностью, гарантированно — это то место, где описание вероятнее всего врёт, и опровергнуть их покупателю проще всего. Говорите то, что верно для следующей продажи, а не то, что вам хотелось бы считать верным для всех.

Мы написали

Проверка, сработавшая на нашей собственной документации.

Правда

Проверка абсолютных путей сработала на файле, который эту самую проверку объясняет, потому что в нём есть пример пути. Она сработала бы на любом README, где продавцу советуют убрать пути вида /Users/… Исправлений три: паттерн теперь требует сегмент пользователя и что-то после него, текстовые файлы исключены, а формулировка больше не содержит полного пути.

Для вашей карточки

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

Мы написали

Предупреждение о пустых папках, судившее не о том.

Правда

Оно смотрело на файловую систему. Папка, в которой лежит только .gitkeep, не пуста на диске и приезжает пустой в проект покупателя, потому что экспортёр Unity этот файл не берёт. Источником истины должно быть то, что производит экспортёр, а не то, что продавец видит в Finder.

Для вашей карточки

Проверяйте то, что получает покупатель, а не то, что есть у вас. Ваша папка, ваш проект и ваш диск — всё это загрузка с собой не несёт.

Чего он не делает

  • Это не антивирус. Макрос внутри настоящего документа проходит его нетронутым.
  • Он не судит, хорош ли ваш ассет. Только доезжает ли он рабочим.
  • Он только для Unity. Версия для Blender есть; для Unreal, Photoshop и Cinema 4D нет ничего.
  • Пакеты свыше 150 МБ записываются как непроверенные, и опубликовать их всё равно можно. Отказать продавцу из-за нашего собственного ограничения значило бы выставить ему счёт за наше ограничение.

Как мы себя убедили

Фикстуры сделала Unity, а не мы

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

Стенд, который его ставит и жмёт кнопки

Скрипт создаёт проект, компилирует инструмент, гоняет валидатор и выходит с ненулевым кодом, если находки изменились. Юнит-тесты читают настоящие экспортированные пакеты; стенд покрывает то, чего юнит-тест не видит: что оно вообще компилируется и что нажатие кнопки делает ровно то, что следует из чтения кода.

Чистая фикстура важнее битой

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

Сама карточка

Описание начинается с того, что инструмент предотвращает

Не с того, что это за инструмент, — с того, что будет с вами без него. Первый абзац — история про «Missing (Mono Script)», потому что это фраза, которую издатель под Unity узнаёт сразу. Дальше полный список того, что блокирует публикацию, и дальше прямо — чего инструмент не делает.

Обложка говорит, что это за вещь, уже в размере миниатюры

Первой версией был наш маскот: честно и покупателю не говорит ничего — та же картинка стоит на каждой странице этого сайта. Та, что сейчас в карточке, рисует сам товар: пакет, который осматривают, а слово написано от руки, а не воспроизведено логотипом, потому что воспроизводить чужой товарный знак в сгенерированной картинке — это и юридический вопрос, и гарантированное уродство.

Он бесплатный, и в нём ничего не продаётся

Брать деньги за то, что делает чужие ассеты пригодными к продаже, значило бы брать деньги за собственную планку качества. Это ещё и вход на площадку: установленный инструмент стоит нам больше, чем проданный.

Один файл, который заменяется, а не копится

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

Он прошёл наш собственный гейт, и наш собственный гейт ему отказал

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