Buffer icon Проекты
39 заметок с тегом

с#

Позднее Ctrl + ↑

Форматирование С# кода в 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 коммента готов.

Командный бой на Unity (пример)

Так и не придумал как будет правильней назвать этот пример :)

Unity team fight example

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

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

Из положительных моментов: почти не выделяется память, только на корутины анимации (но это можно убрать) и все отрисовывается за 2-4 DC.

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

Создание плагинов для Unity

Плагины для Unity

Плагины для Unity

Плагины для Unity

Пишу статью про создание плагинов для Unity под iOS и Android. Нужны комменты и советы.

За несколько лет, я сделал большое количество различных плагинов. Многие они не в паблике и опенсорс, но это не надолго (надеюсь :).

Есть куча ситуаций когда одной Unity недостаточно и нужно использовать возможности платформы. Банально, но до сих пор, в Unity нет работы с галерей и камерой из коробки :) Смешно? Не очень. В Xamarin есть, а в Unity нет.

Для многих менее опытных разработчиков, создание плагина для Unity под мобильную платформу кажется чем-то сложным, но на деле, это не так сложно и страшно. По крайней мере, организовать простое взаимодействие — достаточно просто. В статье, будет шаблон для Android (на Java) и iOS (на Obj-C) для создания плагинов и их связи с Unity приложением.

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

 1 комментарий    1865   2020   android   apple   camera   ios   plugin   unity   разработка   с#

Unity EventBus на интерфейсах

public class SaveLoadManager : Monobehaviour, IQiuckSaveHandler
{
    private void OnEnable()
    {
        EventBus.Subscribe(this);
    }

    private void OnDisable()
    {
        EventBus.Unsubscribe(this);
    }

    private void HandleQuickSave()
    {
        // код сохранения
        ...
    }
}

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

Unity & iOS capabilities

iOS capabilities list

iOS capabilities list

iOS capabilities list

Как оказалось, даже для последних версий Unity, есть проблема программно выставить нужные параметры в Xcode проекте :( А это необходимость, иначе никакой CI\CD не работает и придётся билдить iOS версию вручную, что конечно не очень правильно.

Для этих целей в Unity есть специальный PostProcessBuildAttribute и PBXProject. После билда в Xcode проект, можно настраивать уже другие параметры, не доступные внутри Unity. Но, даже следуя мануалам, как-то оно не всё работает...

Так, например, чтобы добавить функцию Sign in with Apple, нужно воспользоваться ProjectCapabilityManager. В коде это выглядит примерно так:

...
string projectPath = string.Format ("{0}/Unity-iPhone.xcodeproj/project.pbxproj", path);
PBXProject project = new PBXProject ();
string file = File.ReadAllText (projectPath);
project.ReadFromString (file);
string target = project.GetUnityMainTargetGuid ();
string entFile = "game.entitlements";
ProjectCapabilityManager manager = new ProjectCapabilityManager (projectPath, entFile, "Unity-iPhone", target);
manager.AddSignInWithApple ();
// other capabilities
manager.WriteToFile ();

Но таким образом файл X.entitlements не добавляется в проект, создаётся, но не добавляется. И через project.AddFile() — тоже. Спасает как всегда stackoverflow :) Оказывается, помимо project.AddFile() надо добавить ещё специальный property, чтобы всё закрутилось:

...
project.AddFile (entFile, entFile);
project.AddBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", entFile);
File.WriteAllText (projectPath, project.WriteToString ());

Почему это не написано в мануале Unity — непонятно.

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

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

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

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

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

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

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

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

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

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

Исходник

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

TabsView для Unity

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

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

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

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

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

 1 комментарий    657   2020   git   unity   разработка   с#

Unity, нейросеть и птички

Очень простой и понятный пример обучения нейросети с линейной функцией активации. Короче, для самых начинающих. Можно переделать под что-то своё и поинтересней.

Спойлер.
В примере, птички обучились пролетать препятствия за 40+ генераций.

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

 1 комментарий    1959   2019   unity   нейросети   с#

LeoECS 2.0

Там Leopotam обновляет свой ECS — один из самых быстрых, легких, «памятинежрущих» ECS для Unity и вообще C#.

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

Теперь нет отложенных операций, всё применяется сразу, есть автоинжект фильтров и «мира», переделано API, но обратная совместимость для перехода осталась. Создавать сущности и добавлять компоненты теперь удобней и понятней.

Пока в dev-ветке, но релиз скоро.
Чатик на gitter.im
Discord канал

 Нет комментариев    1582   2019   ecs   unity   с#
Ранее Ctrl + ↓