Buffer icon Проекты

Избранное

Как использовать Git Submodules в Unity

И тут сразу возникает вопрос: почему не использовать пакеты и UPM? Это удобно, да и весь механизм уже встроен в Unity?

Но как оказалось, не всегда удаётся выделить какую-то часть приложения в отдельный пакет, чтобы у него было минимум зависимостей и он представлял из себя какую-то самостоятельную единицу. Проекты бывают разные, с различной архитектурой и набором дополнительных ассетов и прочего. А выделить какую-то общую часть (ядро) хочется, чтобы использовать её в других проектах... В общем, если по какой-то причине пакеты вам не подходят — попробуйте Git Submodules.

В чём отличие при работе с сабмодулями гита?
Unity использует скрипты и ассеты которые расположены в папке Assets. Если вы попробуйте подключить сабмодуль и указать путь, например Assets/Core, то ничего не получится, потому что папка Assets уже существует. Поэтому надо провернуть такой финт:

  1. Подключаете сабмодуль к проекту (как это сделать, тут описывать не буду, потому что есть разные клиенты SourceTree, Fork, GitKraken, просто консоль)
  2. В качестве директории можно указать Modules/your_module
  3. Переходите в папку Assets
  4. Устанавливаете симлинк (symlink) на новый сабмодуль. Всё! Он у вас в проекте, можно пользоваться.
cd Assets
ln -s ../Modules/Core Core

Выглядеть это будет примерно так:

Unity Git submodules

Unity Git submodules

Unity Git submodules

Теперь если в подключаемых сабмодулях, что-то меняется, надо просто спуллить обновления. В общем, кто привык работать с Git, то всё достаточно привычно и понятно.

MoDI

MoDI. Lightweight IoC container for Unity.

MoDI. Lightweight IoC container for Unity.

MoDI. Lightweight IoC container for Unity.

MoDI — простой контейнер для внедрения зависимостей в Unity.

Когда я хочу в чём-то разобраться, я почти сразу перехожу к практической части. Если со старта не получается, тогда начинаю читать мануалы :) После этого, снова повторяю шаг №1 и так по кругу. Иногда это надоедает и я или ищу другие пути решения, или говорю себе, что это «не моё», мне это не надо — сдаюсь короче.

Решил я однажды разобраться как работать с Zenject и Ninject в Unity. Сделал несколько тестовых проектов — вроде работает. Начал копать дальше, понял принцип и решил, что хочу своё такое же, но попроще :) И чтобы было достаточно для всех моих разработческих потребностей. Так появился MoDI.

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

Это можно сказать и про ECS, да Leopotam? :)

MoDI можно подключить к проекту с помощью пакетного менеджера, через него же можно импортировать сцену с примерами. Ну или просто скачать архив и добавить в проект.

Простейший пример выглядит так:

using MoDI;
using UnityEngine;

public class QuickStart : MonoBehaviour {

    public void Start() {
        DI.Get().Bind<Hello>().WithArguments("Hi, I'm MoDI!");
        Hello hello = DI.Get().Resolve<Hello>();
    }
    
}

public class Hello {

    public Hello(string data) {
        Debug.Log(data);
    }

}

После запуска данного скрипта в консоли появится сообщение: «Hi, I’m MoDI!».

В документации можно найти ещё примеры и описание API.

Очередной велосипед для себя, но может кого-то заинтересует. Если хотите разработаться в этом как и я, пишите, помогу чем смогу 😉

Форматирование С# кода в VS Code

До недавних пор, весь код я форматировал с помощью расширения C# FixFormat. Оно старое, не поддерживается, но работает! И вполне себе работает.

Но после недавней переустановки VS Code, я ставил заново расширение для C# (OmniSharp) и погуглил на предмет выше. Как оказалось, OmniSharp уже умеет сам форматировать код, причем использует все необходимые параметры.

Для того чтобы всё это заработало, надо в корне проекта создать файл omnisharp.json и добавить туда параметры форматирования. Например:

{
    "FormattingOptions": {
        "newLine": "\n",
        "useTabs": false,
        "tabSize": 4,
        "indentationSize": 4,
        "NewLinesForBracesInTypes": false,
        "NewLinesForBracesInMethods": false,
        "NewLinesForBracesInProperties": false,
        "NewLinesForBracesInAccessors": false,
        "NewLinesForBracesInAnonymousMethods": false,
        "NewLinesForBracesInControlBlocks": false,
        "NewLinesForBracesInAnonymousTypes": false,
        "NewLinesForBracesInObjectCollectionArrayInitializers": false,
        "NewLinesForBracesInLambdaExpressionBody": false,
        "NewLineForElse": false,
        "NewLineForCatch": false,
        "NewLineForFinally": false,
        "NewLineForMembersInObjectInit": false,
        "NewLineForMembersInAnonymousTypes": false,
        "NewLineForClausesInQuery": false
    }
}

Также, не забудьте поставить в настройках VS Code:

  • Csharp → Format → true
  • Editor → Default formatter → ms-dotnettools.csharp

Для форматирования при вводе и сохранении:

  • Editor → Format On Type → true
  • Editor → Format On Save → true

И как бонус: OmniSharp также научился ставить XML комментарии, так что, минус ещё одно расширение. Просто вводите три слеша над методом и шаблон XML коммента готов.

Пароль от SSH ключа

Забыл пароль от SSH ключа. И такое бывает...

Уже думал, что сейчас сделаю новый и потом буду обновлять ключ на всех серверах, на Github и прочих сайтах. Но, как оказалось в MacOS есть возможность посмотреть пароль.

  1. Открываете «Связку ключей»
  2. Ищите свой ключ (id_rsa или любой другой)
  3. Вводите пароль пользователя (скорее всего пользователь должен быть админом)
  4. Всё!
 Нет комментариев    544   11 мес   mac

Как освободить место на MacOS

Cleanup MacOS

Cleanup MacOS

Cleanup MacOS

Я уже как-то писал, как освободил кучу места на маке, почистив кеш Xcode. Есть даже специальная программа DevCleaner for Xcode, чтобы не ковыряться по папкам вручную, ей то я и пользуюсь теперь.

Как бы не хвалили MacOS, в сравнении с Windows, но система засирается также, как и ОС от Microsoft.

Но, время шло, а место на диске по чуть-чуть уменьшается и уменьшается. Даже не смотря на то, что я чистил кеш Xcode, логи и прочее. В какой-то момент, раздел Другое стал занимать больше 200 ГБ! Погуглил. Рекомендовали, запуститься в безопасном режиме и перезагрузить 🤷‍♂️. Да, это вообще не помогло, освободилось может пару сотен мегабайт. Скачал MacCleaner и посмотрел, что же там такого...

  1. Удалил кеши от старых программ в ~/Library/Caches (почему мак их не чистит сам — хз)
  2. Удалил папки от неиспользуемых программ в ~/Library/Application Support
  3. Удалил сам Xcode и папки, которые к нему относились
  4. Ещё мелочи всякие

Сколько читал и видел этой навязчивой рекламы MacCleaner, почти все писали, что это мусорный апп и т. п. Не знаю, первый раз запускал, но пользу он принёс.

Освободилось немного, но всё равно, раздел Другое был огромным. Потом, я запустил Disk Expert от того же MacCleaner и пошёл искать ещё. И в системных! папках было две, по 35 ГБ каждая: com.apple.Developer и com.apple.AppStore. Погуглил про них, я был не одинок :) Там были какие-то кеши старых приложений, Xcode опять же, и очень много другого. Удалил всё из них.

Потом ещё запускал App Cleaner & Uninstaller, этот апп, как я понял, как раз и занимается тем, что удаляет приложение и все его кеши, службы, временные папки, логи и т. д. Короче, то что в Windows делает Uninstall. Поэтому, заявление что в MacOS достаточно удалить программу из папки «Программы» — враньё. Не работает это так.

В итоге: перезагрузился, всё работает, +90 ГБ свободного места.

UPD: ещё есть апп OmniDiskSweeper, простой, но сразу видно где большие файлы и папки, рекомендую.

 1 комментарий    584   1 год   apple   mac

Градиентный текст в Unity

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

Градиент для каждой буквы

Градиент для каждой буквы

Градиент для каждой буквы

Пришлось написать небольшой скрипт, который вешается на текстовый компонент, берёт цвета градиента из свойств и применяет его для всего текста. Стало выглядеть так:

Градиент для всего текста

Градиент для всего текста

Градиент для всего текста

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

Исходник

Теперь будет гуглится по full text gradient unity :)

TabsView для Unity

Сегодня у нас раздел «Велосипедостроение» :)

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

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

  • Управляется свайпами
  • Есть индикаторы состояния табов
  • Анимации можно делать любые, с помощью DOTween
  • На переключение таба можно повесить хук

Исходники на Github

Свой CI/CD для Unity

Mopsicus CI/CD bash script

Mopsicus CI/CD bash script

Mopsicus CI/CD bash script

Написал небольшую статью на Хабр про скрипт который получился в результате автоматизации сборки Unity проектов под Android и iOS. Раньше большинство операций делалось вручную, теперь всё сведено к минимуму.

Один запуск скрипта и:

  • скачиваются последние изменения с GIT
  • запускаются тесты
  • собирается APK для Android, в develop или release
  • собирается для iOS Xcode проект, в develop или release
  • компилируется
  • архивируется и экспортируется в IPA
  • генерируется манифест для него
  • генерируются HTML страницы для установки
  • всё это загружается на сервер с помощью sshpass
  • все логи записываются в отдельную папку
  • отсылается уведомление в Телеграмм, что всё готово

Вот такая интеграция и доставка :)

Исходники на Github

Рассылка по Unity

Mopsicus Newsletter subscribe

Mopsicus Newsletter subscribe

Mopsicus Newsletter subscribe

Решил сделать ежемесячную email рассылку по Unity, играм и разработке.

За месяц скапливается много черновиков, но не все они тянут на статью, а постить мелкие разрозненные заметки не хочется. Поэтому подумал в сторону рассылки.

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

Всего один раз в месяц вы будете получать ссылки на:

  • интересные статьи
  • обзоры
  • видео
  • аналитику
  • исходники
  • скрипты
  • игры
  • инструменты разработки
  • до сюда дочитали?
  • плагины и ассеты
  • мои комментарии ко всему этому

Присоединяйтесь!

📩 Ссылки на все выпуски можно найти по тегу: рассылка.

Ранее Ctrl + ↓