
Официальный сайт: https://unity.com/ru
Документация: https://docs.unity3d.com/Manual/index.html
Уроки: https://unity3d.com/ru/learn/tutorials
Форум: https://forum.unity3d.com
Магазин ассетов: https://assetstore.unity.com
На Unity сделано много замечательных игр: Zenless Zone Zero, V Rising, Hearthstone, VRChat, Escape from Tarkov, Valheim, Pathfinder, Cuphead, Genshin Impact, Subnautica, Albion Online, Endless Space, Beat Saber, Boneworks, Rust, Блицкриг 3, Pillars of Eternity, Tyranny, Kerbal Space Program и многие другие.
Главным преимуществом Unity перед другими движками является его простота для одиночной разработки. Не нужно иметь целую компанию девелоперов, чтобы сделать хорошую игру. Если ты один или имеешь небольшую команду и хочешь сделать хорошую игру без претензий на ААА, то Unity станет лучшим выбором. Тем не менее, даже крупные корпорации зачастую выбирают для своих игр именно Unity.
Какие у Unity сильные стороны?
Простота разработки, удобный инструментарий, кроссплатформенность, богатая документация, огромное сообщество.
Какие у Unity слабые стороны?
Сложность в создании фотореалистичной графики. Для графики "как в Crysis" рекомендуется взять другой движок. Хотя Unity вполне способен выдавать не уступающую любым другим движкам картинку, это требует определённого навыка от разработчика.
На каких языках я могу писать скрипты для Unity?
Поддерживается написание скриптов на C# 9.0
https://docs.unity3d.com/Manual/CSharpCompiler.html
Какие есть готовые решения для создания мультиплеерной игры?
https://www.photonengine.com
https://mirror-networking.com
https://playfab.com
На каких платформах работают созданные с помощью Unity игры?
Windows, Linux, MacOS, SteamOS, Android, iOS, Windows Phone, PlayStation4, Xbox One, WebGL, Oculus Rift и многие другие. Полный список можно найти на официальном сайте. Таким образом, игры Unity работают на десктопах, на смартфонах, планшетах, приставках, в браузерах, VR-очках и некоторых других системах.
Часто вижу скриншоты с красивой природой на Unity. Как такое создать?
Очень просто! В Unity встроены удобные инструменты для создания террейна и SpeedTree для создания деревьев и готовая реализация ветра - не нужно ничего писать или скачивать и подключать плагины - ландшафт в Unity создаётся в пару кликов.
Что нужно уметь делать для создания полноценной игры, кроме Unity-разработки?
Кроме непосредственной разработки игры на Unity, требуется также уметь создавать 3D модели (3ds Max, Blender, ZBrush), 2D рисунки (GraphicsGale, Aseprite, Piskel), текстуры (Substance Designer, NeoTextureEdit), музыку (FruityLoops, Ableton). Не обязательно учить это всё - например, в 2D играх не нужны 3D модели, а музыка необходима далеко не всегда. Также вы можете скачивать элементы для ваших игр на бесплатных сайтах. Если у вас есть деньги, то все необходимые элементы можно заказать у фрилансеров на https://www.fl.ru/ (русскоязычный) или https://www.upwork.com/ (англоязычный).
Бесплатен ли Unity?
Можно свободно скачивать, использовать и продавать готовые игры на Unity с лицензией Personal - это абсолютно бесплатно! Но на бесплатной версии при запуске игры будет появляться короткий стартовый ролик "Made with Unity", а также ваши доходы ограничены 100 000 долларов в год. Для снятия этих ограничений нужно приобретать платные версии лицензий Unity. В конечном итоге, платные варианты используются лишь крупными компаниями с огромными доходами, тогда как обычные разработчики в большинстве своём используют бесплатную Personal лицензию.
Обучение по книгам (печатные издания, актуальные электронные версии книг можно скачать на официальных сайтах издателей)
Обучение языку C# книги на русском языке:
1. C# для чайников Автор книги – Джон Пол Мюллер
2. Программирование на C# для начинающих 2е части Автор: Алексей Васильев
3. Head First. Изучаем C# 4е издание Авторы: Эндрю Стиллмен, Дженнифер Грин
4. Unity и C#. Геймдев от идеи до реализации Автор: Джереми Гибсон Бонд
5. Язык программирования C# 7 и платформы .NET и .NET Core Авторы: Филипп Джепикс, Эндрю Троелсен
Для людей абсолютно не знакомых с движком есть 3и основные книги на русском языке:
1. Разработка игр на Unity 2018 за 24 часа Майка Гейга
(Знакомство с движком, изучение редактора, создание 4х простых игр практически без кода, отличное пособие для полных новичков).
2. Изучаем C# через разработку игр на Unity. 5-е издание Харрисон Ферроне
(Пошаговое освоение всех базовых знаний по программированию на языке С# в редакторе юнити, создание одной игры стрелялки от первого лица, написание искусственного интеллекта врага, книга переведена не совсем корректно и порой встречаются не просто опечатки, а серьёзные неточности перевода.)
3. Unity в действии. Мультиплатформенная разработка на C#. 3-е межд. издание Хокинг Джозеф
(Правильное построение архитектуры кода для сложных проектов, углублённое изучение программированию на C#, создание 4х полноценных игр на движке, обязательно нужно скачать код проектов, так как в книге он местами уже устарел.)
Шапка: https://pastebin.com/raw/JGUAcbwj


360x470, 0:08
https://assetstore.unity.com/publishers/40264
До этого можно было бесплатно получить крутой наборов эффектов, но я забыл вам скинуть хи-хи
Мля. Обычно там устаревшие версии бесплатно. А вообще сколько он там стоит, за доступ ко всем плагинам то?

>все платные ассеты есть в доступе на помойках
Я знаю только одну такую площадку - cgpeers. Однако эти пидармоты забанили мне аккаунт за инактивити.
Чем тебе рутрекер или пиратбей не устраивают? спгпирс вообще странный в последнее время: деньги клянчат постоянно и дизайн меняют и ввели вход в акк каждый раз. Мне кажется они скоро закроются, да и файлы там старые как правило и с вирусами, модерация видимо ослабла.
А мы тут спорим что ли? Я просто написал, что мне кажется, что сгпирс катится куда-то не туда и всё.
Усидчивость имеется.
ты пидор
С блюпринтов на урине в любом случае придется перекатываться в с++ рано или поздно. Плюсы охватывают все игровые движки +- в случае форсмажора. Какими бы они мерзкими порой не были...
А шарп в этом плане не такой гибкий, движков которые поддерживают так-же не очень много.
Но, с друой стороны как будто тоже достаточно работы на нём.
Перекатывайся туда куда хочешь, что за тупость спрашивать что лучше то или то.
Да хоть на асамблере игры пиши если нравится (Что некоторые и делают, даже стримя на твиче).
Если удобно и нравится через принты, делай через них, если больше нравится код и все вот это, то через него.
Слушать петухов которые будут тебе задвигать за то что ты не сможешь что-то сделать если выберешь один из стулье, не надо.
> Но, с друой стороны как будто тоже достаточно работы на нём.
На юнити работы намного больше, чем на анриле и других движках вместе взятых, если в россии и ближайших странах искать.
Но учти, что юнити говномобилки в основном и чтобы тебя на норм проект взяли надо несколько лет ебашить
>что юнити говномобилки в основном
Но и индюков много. Правда платить они будут копейки. Но зато будет небольшая семейная команда, если нравится такой формат работы.
builder.Register(typeof(MyClass<>), Lifetime.Transient);
И потом можно сделать инжект:
[Inject] private readonly MyClass<MyAnotherClass> _myClass;
разработчики юнити строго против использования DI-контейнеров, т.к. это нарушает идеологию Unity:
https://discussions.unity.com/t/dependency-injection-in-unity-inversion-of-control-container/914827
альтернативы:
- DI как scriptable object через сериализуемые поля в инспекторе
- зависимости как синглтоны
- зависимости как сервисы через сервис аллокатор
>разработчики юнити
Ну это очередной даун, который не знает как и что создают на движке, который он разрабатывает. Тем более они купили ironSource, а значит менеджеры рассчитывают на мобилки. А в мобилках ДИ - это жизненная необходимость. Без неё сложный мобильный проект не построишь, там дохера сервисов, сложный интерфейс. Или даже не мобильный, а что-нибудь сервисное, с мультиплеером например.
>scriptable object
Не заменяет ДИ. Он хорош в качестве статических настроек. Не более того.
В целом, зависит от контекста и типа проекта. В какой-нибудь сингловой ПК хуинди ДИ может быть бесполезным или даже вредным.
Хотя... Если прикинуть, то даже в инди ДИ может быть полезным. Я вот дохрена лет с юнити работаю и пришёл к выводу, что прокидывать прямые ссылки через редактор - это плохая идея. Эти ссылки могут теряться. Либо тебе нужно по иерархии спускаться в жопу, чтобы прокинуть вшивую ссылку. Не дай бой ты потом переименуешь компонент неудачно и ссылки пропадут. Плюс интерфейс нормально не прокинешь.
А через ДИ у тебя все ссылки будут в root-компоненте, который один на сцене. Ты туда все менеджеры подключил, спавнеры врагов, виндоус менеджер, ещё какую-нибудь залупу, и далее в своих компонентах ты получаешь ссылки через ДИ. А если ты работаешь с интерфейсами, ты ещё сможешь подменять легко реализацию для быстрого теста различных кейсов.
в мобилках DI строго противопоказан
это тяжеловесная хуйня которая используется в банках. поэтому банки так тормозят
для производительных игр это не подходит

720x400, 0:03
>в мобилках DI строго противопоказан
Бро, в мобилках это база. Причём уже давно. Сейчас это не просто база, это базиллион баз.
Вот тебе конкретный пример. Игрушка 2016 года - Покехрен Го, с 500+ млн установок.
Они уже тогда полностью выстроили архитектуру на DI. Ещё раз - ПОЛНОСТЬЮ. Хотя тогда действительно и проблемы с производительностью были, и они использовали стрёмный Zenject (который сейчас строго не рекомендуется использовать). Короче посмотри сам, если интересно разобраться:
https://www.youtube.com/watch?v=8hru629dkRY
Шиза.
var a = new A();
var b = new B(a);
Пиздец тяжеловесно. Ровно то же самое, что ты бы и через код делал.
>>6352
> разработчики юнити строго против использования DI-контейнеров
Какие? Юнити буквально вконтейнер юзают в своих репозиториях лол.
> это нарушает идеологию Unity
Кому какое дело до того что кто нарушает и какая у юнити есть идеология?(никакая)
> - DI как scriptable object через сериализуемые поля в инспекторе
Удачи рулить мердж конфликты)
> - зависимости как синглтоны
Удачи иметь несколько инстансов реализующих один интерфейс для разных областей приложения
> - зависимости как сервисы через сервис аллокатор
Если ди нарушает что там юнитевое, то почему сервис локатор не нарушает?
Сервис локатор концептуально очень схож с ди, но у него есть недостатки, если мы говорим о глобальном прокидывании зависимостей в проекте
>Удачи иметь несколько инстансов реализующих один интерфейс для разных областей приложения
ты о мультиплеерной кнопке?
через ui Sprite в нужных кусках экрана? яерез Plane с уанимайуией? или есть еще какие-то фишки для подобного стиля?
Скачай и посмотри как делали в юнити.
https://assetstore.unity.com/packages/essentials/tutorial-projects/dragon-crashers-urp-2d-sample-project-190721
у тебя по ссылке чисто 2д-шный проект
> This Unity URP 2D sample project showcases Unity’s 2D tools and graphics capabilities.
я спрашиваю примерно про такое:
комнаты/окружение 3д-шное, персонажи и разные объекты 2д-спрайты
в Ягненке вообще 99% содержимого "плоское", включая постройки
Заебала эта параша, из-за неё у меня нормально не сохраняются сначало префабы, потом и сцена. Движок просто виснет а бесконечном поиске что сохранить, если перезапустить движок можно потерять префаб или вообще сцену.
Я уже так задрочился, что научился сохранять сцену и префабы через блокнот, но это же не нормально, что вместо стандартного сохранения я юзаю блокнот.
Искал решение - пишет проблема в самом движке, слишком длинные имена он не сохраняет.
Готов укоротить имена файлов и уммень шить путь к файлам, но проблема не знаю где именнн. Второй пик это пример имени файла.
ебучий ты шиз, если ты очередной даун который пытается в Resources.Load не понимая как он работает - то это только твои пробелмы
>Движок просто виснет а бесконечном поиске
а нах ты условие для выхода не сделал?
даже так все ещё лучше урины.
как только вспоминаю траву с артефактами или мыло это фирменное анрильское - сразу кулак сжимается.
и она такая даже в играх с огромным бюджетом, потому, что даже студиям впадлу трогать встроенное сглаживание
так что терпи юнити и оно тебе воздастся
У меня длиннеее имена файлов были и все норм. Попробуй обновить юнити, минорную версию
Не, дело точно не в длине, у тебя там +- нормально все, вот примерно в два раза если длиннее было, можно было уже думать насчет этого.
Чтоб найти проблему прям точно - Создай пустой проект, и начни переносить вещи которые как ты думаешь конфликтуют, и найдешь траблу.
> У меня шейдеры самописные боюсь заруинить всё.
git reset напишешь в консоли
А так, от апгрейда минорной версии вообще нихуя не будет.
Я знаю как сделать настрйоки, чтобы пользователь мог сам себе поставить как у него будет запускаться. Но как именно чтобы по умолчанию всегда запускалась в окне, хз

Проклятие юнити
У тебя жесткий диск или ссд? Если юнь что то интенсивно делает с памятью, то мб головка жесткого диска шумит. Такое бывает. Скорее всего это плохо и жесткому приходит хана, но некоторые диски шумные by design и шумят с завода, так что смотреть надо.
>мой комп издаёт абсолютно инфернальные звуки какого-то скрежета во время того как запущен билд. Что это может быть?
Что с кулером?Может грязь залетела
Спасибо анон, скорее всего дело в этом, тк вчера на реддите видел предположение об ограничении фреймрейта, нужно будет посмотреть как у компьютера буду. Не подскажешь, это в настройках проекта смотреть или свой скрипт писать надо?
в движке за много миллиардов деняк - это делается только через скрипт
Application.targetFrameRate = 60;

Я бы ещё рекомендовал включить всинх в редакторе. Иначе окно Game начинает миллион фпс выдавать и видимокарту разрывает.
А ну да, точняк, дроссели свистят. У меня на старой гтх 1060 свистели тоже иногда
Вот при запущенном Хроме ничего не свистит, например.
А если не ограничивать фреймрейт в Юнити, то видеокарта просто греется и включает вентиляторы, как при обычной нагрузке. Это другое.
Unity 6 отключен в Китае!
https://80.lv/articles/unity-6-is-taken-offline-in-china/
Этот наиболее широко используемый движок для разработки игр, разработанный Unity Technologies, будет заменен локализованной версией Unity в Китае под названием 团结引擎.
У китайцев будет версия с нанитами и люменом.
Видимо из-за того, что обычный юнити связан с американскими сервисами сбора данных, google play и т.п. В чайне всё это не работает.
>Видимо из-за того, что обычный юнити связан с американскими сервисами сбора данных, google play и т.п. В чайне всё это не работает.
Да работает это все там. Они просто отключили именно 6 версию, что бы пользовались китайской сборкой юнити.
>с нанитами и люменом
Слава богу у нас не будет этого кала. А китайцам придётся лишний раз пердолиться и выпиливать этот мусор самостоятельно, но, я думаю, они справятся, если постараются.
Дело не в движке, а в ОС, полный путь от корневого каталога к файлу вместе с его именем не должен превышать 256 символов. У тебя, судя по всему, более 256 символов. Попробуй сократить кол-во папок до файла. Чтобы было не более 4. У тебя сейчас 7.
Тут пишут что использовать linq для чего либо это страшный зашквар и все тормозит, поэтому вообще нельзя его включать. Даже в сравнении с другими библиотеками.
Чего, все действительно настолько плохо?
Очевидно, что окружение делается объемным с флэт-шейдерами, а персонажи, пикаблы и т.п. - это квады, на которые через шейдер накидывается кадры с атласов текстур. По такой схеме сделаны тук-тук и культ овцы.
Да, линк хоть и удобная библа, но подходит только для интерпрайза. Для игр лучше использовать кастомные решения.
Он просто в память срёт. Но если ты не собираешься его использовать в каждом цикле апдейта, то не вижу проблем. Тем более он уже далеко не такой плохой, какой был лет 10 назад.
Об этом я и говорил, спасибо пчел.
Первый вариант читается в 10 раз проще.
Ещё сильнее разница, когда это скомбинировано с объявлением переменной, так как в первом случае её можно сразу же в одной строке присвоить:
Первый вариант:
Color color = path ? Color.Green : Color.White;
Второй вариант:
Color color;
if (path)
Color = Color.Green;
else
Color = Color.White;
>>7159
>Color color = path ? Color.Green : Color.White;
Ебать.
Вы хоть когда-нибудь код рефакторите?
В этом случае все просто, так как переменные простые, а теперь я посмотрю как вы навернёте, когда в исполняющем блоке будут нормальные методы типа
float direction = (GameRoot.ScreenSize / 2 - Position).ToAngle() + rand.NextFloat(-MathHelper.PiOver2, MathHelper.PiOver2);
////
>читается в 10 раз проще.
direction = bounds.Contains(Position.ToPoint()) ? (GameRoot.ScreenSize / 2 - Position).ToAngle() + rand.NextFloat(-MathHelper.PiOver2, MathHelper.PiOver2) : (GameRoot.ScreenSize / 2 - Position).ToAngle() + rand.NextFloat(-MathHelper.PiOver1, MathHelper.PiOver1);
> В этом случае все просто
Какой случай показал - тот и объяснил. В нём использование тернарного оператора супер правильное решение.
> так как переменные простые, а теперь я посмотрю как вы навернёте, когда в исполняющем блоке будут нормальные методы типа
> direction = bounds.Contains(Position.ToPoint()) ? (GameRoot.ScreenSize / 2 - Position).ToAngle() + rand.NextFloat(-MathHelper.PiOver2, MathHelper.PiOver2) : (GameRoot.ScreenSize / 2 - Position).ToAngle() + rand.NextFloat(-MathHelper.PiOver1, MathHelper.PiOver1);
Тут нечитаемо.
Надо ж думать всё таки, где что использовать, в некоторых местах тернарный оператор может быть менее удобным чем какой-то другой вариант, надо смотреть.
Но над этим примером стоит подумать чуть больше, чем "ыыы тут тернарный оператор не удобен", потому что тут намного больше проблем и они не с тернарным оператором.
Я бы так сделал:
bool inBounds = bounds.Contains(Position.ToPoint());
float baseAngle = (GameRoot.ScreenSize / 2 - Position).ToAngle();
float addAngleRange = inBounds ? MathHelper.PiOver2 : MathHelper.PiOver1;
direction = baseAngle + rand.NextFloat(-addAngleRange, addAngleRange);
1. Убрано дублирование кода. Дублирование никогда не должно быть.
2. Сильно уменьшена когнитивная нагрузка - каждая сущность в коде намного более простая чем исходный вариант
3. Оперируем в итоговом вычислении с понятными значениями которым присвоено имя
спасибо за идею, посмотрю в эту сторону
Котел писал "без выебонов" и надорвался под тяжестью бойлерплейта, недописал игру. Вот и думай.

Тернарный условный оператор пришёл в C# из С++, потому что кому-то не хватало ифов и свичей, это я узнал как раз из книги и то что автор настоятельно рекомендовал, не пользоваться тернарными операторами. Что в последствии я понял почему.
И насчёт книг, те что приведены в шапке это я писал и почти каждую из них изучил от корки до корки. И почти каждая стоит у меня на полке.
И да скорее всего я перепутал определение рефакторинг и дебаггинг.
Как раз при рефакторинге, когда всё работают и начинают выговаривать конструкции наизнанку в угоду оптимизации, там конечно можно и повыпендриваться, чтобы потомки восхитились уровнем программистов.
Это даже не без выебонов, это просто код очень слабого разраба.
Котёл надорвался в первую очередь, потому что хотел откусить больше чем смог осилить.
Но здесь я могу оперировать только личным опытом, если долго что-то делаешь, то неизбежно что-то забываешь и когда читаешь код и начинаешь смотреть на подобные конструкции, вместо пробежаться глазами, ты начинаешь разбирать строку, на что уходит время больше, чем если бы ты отделался стандартными конструкциями.
А вообще кто-нибудь проверял, там вот так сильно улучшается производительность, на современных пк монстрах?
>не пользоваться тернарными операторами
В нём нет ничего плохого. Можно и обычный IF написать таким образом, что нихуя непонятно будет. Максимально желательно, чтоб ни в IF, ни в тернарном операторе, не происходило никаких вычислений.

Не знаю какими метриками ты проценты намеряешь, есть Си которыы породил такое понятие как си-подобный синтаксис и разные языки на нём основанные.
С++ взял си-подобныц синтаксис, спиздил классы из смоллтолка и всё это натянут на базу Си.
Сишарп взял си-подобный синтаксис и напиздил идей из других языков, главным конкурентом рассматривалась жава на которую в первую очередь и ориентировались, что видно по многим синтаксическим моментам которые перккочевали из джавы, менеджед памяти, явной стандартизации разных видов "классов". Идея в общем-то и заключалась в том, чтобы сделать более современный клон джавы и не допустить её ошибок проектирования.
В дальнейшем шарп стал пиздить всякую хуйню из раста и прочих новомодных языков, и сам вводил какие-то свои фичи, преимущественно тз разряда синтаксического сахара и квалити оф лайф, не какие-то прям новые концепции.
Ввиду этого, утвреждение, что C# взял 85% всего из С++ очень странное, особенно с учетом того, что многие типичные для современных языков штуки появляютсч в С++ позже чем в шарпе(а в шарп пиздятся из других языков)
На твоих скринах я лишь вижу проблемы в архитектуре, не более.
Вангую почти с 99.9% вероятностью котел бросил разработку своей игры далеко не из-за этого.
> Но здесь я могу оперировать только личным опытом, если долго что-то делаешь, то неизбежно что-то забываешь и когда читаешь код и начинаешь смотреть на подобные конструкции, вместо пробежаться глазами, ты начинаешь разбирать строку, на что уходит время больше, чем если бы ты отделался стандартными конструкциями.
Ну, если ты всерьез занимаешься программированием, вряд ли для тебя будет проблемой запомнить, что такое тернарный оператор и прочая хуйня.
Вся эта хуйня и вводится для упрощения читаемости, чтобы ты мог одним взглядом окинуть код и быстрее сориентироваться что происходит, куда смотреть.
Но синтаксисические конструкции удобнве это чисто для упрощения чтения, глобально чтобы ориентироваться в старом коде надо нормально его проектирвоать - юзать понятные имена, дробить на небольшие методы, вводить переменные в которые складировать какие то промежуточные значения, не дублировать схожее поведения и данные в разных местах кода, ну много всего короч.
> А вообще кто-нибудь проверял, там вот так сильно улучшается производительность, на современных пк монстрах?
От чего? От синтаксического сахара? Нисколько.
этот щарит
Лучше принудительно включать вертикальную синхронизацию, у меня без нее персонаж почему то странно косоебится в стороны при движении
Молодец. Патхфайдинг одна из вещей которые меня каждый раз заебывает делать, причем блядь 20 лет назад во времена универа графы я понимал лучше всего из тогдашнего курса
Пчел просто ради интереса, я не в первый раз вижу тебя, ты вроде бывалый, имеешь академ образование и опыт в разработке, зачем ты сидишь на дваче? Конечно спасибо за помощь в юнити, но развне не зашкварно что-то уметь и сидеть на дваче?
С каких пор сидеть на дваче зашквар и почему кому-то должно быть не поебать что кто-то там думает?
Двач очень прикольный и весёлый форум, я буду тут сидеть. И участвовать в твг.
мимо
Ты прав, но с другой стороны сидеть в гд тредах и читать без игорных ебанатов которые ничего не сделали а все знают это зашквар полный. У меня все ще кошмары с рогалик тредов где люди на полном серьезе советовали изобретать колесо, вместо с того чтобы использовать уже придуманное и рабочее для простых вещей типа генерации карт.
Хуже только хабр.
Ну, тут не все такие, тут есть и нормальные новички, есть и шарящие челы
Сидеть здесь блядь и читать ебанатов, это пиздец как себя не уважать.
>использовать уже придуманное и рабочее для простых вещей типа генерации карт.
Ебануться. Одно из самого главного в рогалике - уникальная карта, а тут советуют ассетфлипать.
>самоутверждаться
Здесь все анонимы, дебил. Я даже не знаю, кто из вас срущий петух-шизик-семёнович.
Не, есть две мочи. Одна которая работает по репортам, особенно по всякой политоте, прибегает обычно быстро.
Вторая наша, как грится наш слоняра, который в курсе всей движухи на доске, и знает всех шизиков по железу. Догадки есть разные, но это не важно.
какое ещё железо, модератор доски не видит даже полностью айпишник
но срущий петух-то сам про себя всё знает
> или ты думаешь как детектятся шизы которые дергают роутер по кд??
Никак?
Я когда в дотатреде срал, меня никто не детектил
Репорт это прямое доказательство моей правоты, ты не знаешь что ответить и просто сливаешься зовя мочуха.
Заметная часть разработчиков на юнити не разбираются в программировании и не умеют толком пользоваться юнити, однако выпускают игры и даже сидят на форумах и раздают советы. Тут главное не умение, а усердие и удача.
Так главное что они достигают поставленной цели и выпускают свои игры
Ну это дефолтная реализация EventBus, можешь погуглить его юзкейсы, вроде от разрабов пасфайндера на хабре статья была.
Идея сама в том, чтобы какие-то системы могли коммуницировать между собой, не имея прямой зависимости друг от друга.
Весь геймплей на нём строить не стоит я бы сказал(я пробовал сразу в проде кек, потом насинается путаница в каком порядке подписчики ивента должны реагировать, потому что в голове это держать нереально, потом забудешь), но если юзать в редких случаях каких-то, то вроде норм.
Например из меню стреляешь ивент старта игры. Получается меню не обязано знать, кто там как игру должен стартовать, а стартер игры не должен знать ничего про игру, следовательно и то и другое можно поместить в разные ассембли, которые будут иметь ссылку на ассембли с определениеи ивента.
Image background;
TMP_Text text;
background.color = Color.black;
background.enabled = true;
text.text = "Text";
text.enabled = true;

нужна программа для нарезки изображения на тайлы
У меня есть высоко художественная картинка хочу разбить её на плитку и загрузить в движок. НЕ СРЕДСТВАМИ ЮНИТИ!.
>но если юзать в редких случаях каких-то, то вроде норм
Вот у меня такое же ощущение сложилось. Но, зачем мне для редких случаях подключать этого монстра, если можно написать свой простой Event Bus. Наверное MessagePipe больше для корпоратов с большими проектами.
А ты переходил с UniRx на R3? Есть ли с этим проблемы? Думаю заменить UniRx на новую библиотеку от этого же автора.
Да про это я в курсе, но оно не выравнивает, а просто масштабирует. Т.е. да, если я поставил надпись почти в центр, то при смене разрешения экрана она будет масштабироваться, но не будет pixel perfect выравнивания по центру как в каком-нибудь Ворде или Фотошопе.
Будет. Погугли видосы или пткажи пример как у тебя не получается.
Там всё ко всему привязывается и якораями закрепляется для масштабирования

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

Господа, есть ли кто здесь разбирается в новых веениях 12й версии шарпа?
Что этот еблпн нехороший человек сделал со свичём?

Вот то что тебе нужно:
Паттерн матчинг, удобная штука, в актуальных версиях юнити поддерживается
иф эффект == эффект.фриз ретур нью ...
иф эффект == ...
Ну почему сразу монстра, 1 такой либой больше или меньше не страшно.
Если код стриппинг включен, то и куча лишнего кода не попадет в билд.
Но а так да, простую реализацию сделать легко.
По поводу Р3 - апи во многом очень похоже на юнирх судя по тому что я видел. Сам не юзал, потому что юнирх на все хватает и каких-то особых проблем с ним нету.
>код стриппинг включен
В чем различие уровня стрипинга в настройках? Мельком читал что на слабом код не ломается, а если макс сделать то может попидорасить, замечал чтонить?
Макс не ставил.
Если ставить средний, то он начинает уже агрессивно вырезать код, но терпимо - например у меня вырезал конструкторы классов которые зареганы в вконтейнере, даже дефолтные конструкторы, которые сами генерируются.
Но это можно обойти - на все конструкторы классов, которые зареганы в вконтейнере, Preserve повесить, а если у класса конструктора нет - сделать пустоц и на него Preserve.
Билд сокращается ощутимо, что то типа со 100мб до 80мб на андроиде падал, например
Удобно?
Вы не могли бы расшифровать, этот свич?
Я придерживаюсь одной простой концепции если код мне не понятен, я шлю его нахуй и переписываю на понятный мне код.
High - даже не пытайся ставить
Medium - вроде бы всё хорошо, но насколько я помню, то что-то в Steamworks ломается и билд отправляется в помойку
Low - заебись

Мда, тут конечно в целом надо код рефакторить. Но если без изменений, то вот так
https://pastebin.com/mGmcjfdE
> Вы не могли бы расшифровать, этот свич?
Я это уже сделал.
> иф (эффект == эффект.фриз) ретурн нью ...
> иф (эффект == эффект.чтотоеще) ретурн нью
> Я придерживаюсь одной простой концепции если код мне не понятен, я шлю его нахуй и переписываю на понятный мне код.
Достаточно открыть справку по языку, или вбить его в чат гпт и попросить объяснить.
>>7351
То что ты развернул это не часть свича, это лямбда функции.
void HihiHaha(Monster monster)
{
monster.RecalculateSpeed();
}
И в место вызова лямбы вставить HihiHaha. Аналогично с остальными лямбдами.

Спасибо, и последнее это проверка на null и в случае удачи возвращает значение?
Короче как можно упростить лямбда выражение?

>Короче как можно упростить лямбда выражение?
Если хочется ещё больше раскрыть лямбду, то вот способ.
Ну медиум норм тема, ращмер билда сильно сокращает, особенно когда у тебя в проекте куча стороннего кода, всякие там сдк есть. Просто Preserve на конструкторы повесить и скомпилится.
High хз, я даже не пробовал.

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

Ты правильно чувствуешь, что код в первую очередь должен быть читаемым. У C# много возможностей и некоторые ими сильно злоупотребляют в угоду написания короткого кода.
Могу тебе сразу посоветовать всегда использовать фигурные скобки, даже если после оператора (if/for) идёт одна строка кода. С опытом понимаешь, что это повышает читабильность и уберегает от ошибок.
>Нахуя
Читается легче
Нет повторения слова damage несколько раз.
Любое повторение это всегда хуйня, если есть возможность его избежать - стоит избежать. Потому что потом damage надо будет заменить на damageReceived какой нибудь, ты его скопируешь, и должен будешь все слова damage заменить, не заметишь во второй строке damage и будет пиздецовый баг.
Любое снижение когнитивной нагрузки(сколько всего надотдержать в голове) и пространмтва для ошибки по невнимателньости - это то к чему стоит стремиться.
>>7428
К производительности это никакого отношения не имеет, шарп по производительности не догонит С++. Ну, дотнетовский шарп, джобы с бёрстом могут обгонять С++.
>шарп по производительности не догонит С++
А какие минусы у этого есть? Ну, с одной стороны как будто сложно сделать такую игру, тем более инди, чтобы в плотную упереться в этот фактор.
С другой стороны - RE Engine, где тоже основной язык C#, но, у них свои исходники на руках.
На анриле мало кто из инди полезет ковырять движок так, чтобы впиливать свои решения основательные. Студии чаще этим занимаются, чем обычный инди-разраб. Да и не всегда команда инди это делает.
То есть, при всех плюсах/минусах истина - где-то посередине. Даже при том, что у условного анрила открытый сурс-код и плюсы.

>RE Engine, где тоже основной язык C#
Так вот почему епонцы так любят писать либы на C#. Интересненько...
https://www.youtube.com/watch?v=tDUY90yIC7U
уде давно во всём мире и во всех нормальных школах надрачивают на C# - это самый простой, понятный и полезный язык
По-моему надрачивают на Python.
>код в первую очередь должен быть читаемым
Здесь наверное нас всего двое таких, будем держаться вместе.
Ебанутый)))
Во даун... Как таких заносит сюда

кому ты это сказал?
json все еще единственный способ делать сохранения без самоубийства, но все равно близко к этому, хули юнити единственный движок без встроенного считывания и записи всей сцены
>юнити единственный движок без встроенного считывания и записи всей сцены
Файлы сцены .unity это формат редактора, в рантайме этих файлов всё равно нет.
> Как там, playerprefs все еще лучший способ делать ачивы?
Не думаю, что ачивки(как и любые важные или объёмные данные) стоит делать префсами(они хранятся в реестрее)
Лучше просто файлик в папке с игрой/в папке данных/ в облаке.
> json все еще единственный способ делать сохранения без самоубийства
Смотря каких данных.
Если объем данных большой и должен часто стримиться на диск, лучше использовать что-то без сериализации, либо быструю бинарную сериализацию(binary serializer плохой вариант, а memory pack норм)
> юнити единственный движок без встроенного считывания и записи всей сцены
Так надо
>playerprefs
>json
Все кал, делаешь собственную сериализацию и все, никаких проблем. По мимо того что можешь модифицировать в любых размерах, так еще и методы защиты по типу соли добавлять, взломать такое будет не возможно.
Я честно не знаю в какой ситуации должно быть не похуй что кто-то может отредактировать сейвы. Ну только если игра не ммо, но даже в таком случае редактировать будут пакеты которые тебе отсылают поэтому в каком состоянии ты там хранишь сейвы похуй...
Нахуя свой сериализатор если можно поксорить выхлоп и результат будет не хуже?
В последней игре я вообще сохранял в текстовом редакторе, сначала в целях отладки, а потом просто хер забил, сейчас детишки совсем отупели они не то что-то модифицировать, они даже переписать строку в блокноте не могут.
чем просто позвать функцию и выполнить
В видео что я смотрел там говорили что пиздец как облегчает выполнение левел апов, но как по мне этот пример когда это нужно плохой
если можно сделать эвент - лучше сделать
Ивенты надо юзать когда нужно.
Вернее, ивенты из сишарпа я бы не советовал юзать вообще, лучше UniRx сразу брать.
Можно делать условно так:
playerState.PlayerHealth.Subscribe(health => healthLabel.SetText(health));
И всё, у тебя готово отображение хп персонажа
А что и когда поменялось?
Стало интересно, яндекс и гугл незнают, а АИ отвечает.
В Unity3D требование, чтобы имя файла и имя публичного класса, наследуемого от MonoBehaviour, совпадали, существовало на протяжении долгого времени, так как это обеспечивало правильное связывание скриптов с игровыми объектами в редакторе. Однако начиная с Unity 2020.3 (и более поздних версий) это ограничение было частично снято благодаря улучшениям в системе скриптов и инструментах, таких как Visual Studio Tools for Unity.
Подробности:
До Unity 2020.3:
Имя файла скрипта (например, MyScript.cs) и имя класса внутри этого файла (например, public class MyScript : MonoBehaviour) должны были строго совпадать. Если они не совпадали, Unity выдавала ошибку вроде: "Can't add script component because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match".
Это было связано с тем, как Unity связывала скрипты с компонентами в редакторе.
С Unity 2020.3 и новее:
Благодаря обновлениям в Visual Studio Tools for Unity и улучшениям в обработке скриптов, Unity стала более гибкой в отношении именования. Теперь имя файла и имя класса MonoBehaviour могут не совпадать, но при этом класс должен быть корректно определён и не содержать ошибок компиляции.
Например, файл MyScriptFile.cs может содержать класс public class DifferentName : MonoBehaviour, и Unity сможет его распознать, если скрипт правильно импортирован в проект.
Однако рекомендуется придерживаться старого соглашения (совпадение имён) для удобства и совместимости, особенно при работе в команде или с устаревшими версиями Unity.
Ограничения и рекомендации:
Если в файле несколько классов, только один из них может быть публичным и наследоваться от MonoBehaviour, чтобы Unity корректно его обработала.
Вспомогательные классы (не MonoBehaviour) в том же файле должны быть размещены ниже основного класса, чтобы избежать проблем с компиляцией.
Пространства имён (namespace) иногда могут вызывать проблемы с распознаванием классов в старых версиях Unity, поэтому в таких случаях рекомендуется их избегать или проверять настройки проекта.
Если вы используете DLL-библиотеки, то имена классов внутри них также не обязаны совпадать с именем файла DLL, но они должны быть правильно импортированы в проект.
Почему это изменилось?
Обновления в инструментах разработки (например, Visual Studio Tools for Unity) улучшили интеграцию и обработку скриптов, что позволило снять некоторые строгие ограничения.
Unity стала поддерживать более современные подходы к организации кода, что сделало движок более гибким для разработчиков, использующих сложные архитектуры проектов.
Практический совет:
Хотя Unity 2020.3 и новее допускают несовпадение имён, для упрощения работы и избежания потенциальных ошибок рекомендуется:
Называть файлы и классы одинаково.
Проверять отсутствие ошибок компиляции в скриптах.
Использовать последнюю версию Unity и Visual Studio Tools for Unity для максимальной совместимости.
Если вы работаете с более старыми версиями Unity (до 2020.3), обязательно соблюдайте правило совпадения имён файла и класса.
Источник: Информация основана на документации Unity и обновлениях Visual Studio Tools for Unity, в частности, исправлениях, связанных с обработкой классов MonoBehaviour (например, журнал изменений Visual Studio Tools for Unity).
Стало интересно, яндекс и гугл незнают, а АИ отвечает.
В Unity3D требование, чтобы имя файла и имя публичного класса, наследуемого от MonoBehaviour, совпадали, существовало на протяжении долгого времени, так как это обеспечивало правильное связывание скриптов с игровыми объектами в редакторе. Однако начиная с Unity 2020.3 (и более поздних версий) это ограничение было частично снято благодаря улучшениям в системе скриптов и инструментах, таких как Visual Studio Tools for Unity.
Подробности:
До Unity 2020.3:
Имя файла скрипта (например, MyScript.cs) и имя класса внутри этого файла (например, public class MyScript : MonoBehaviour) должны были строго совпадать. Если они не совпадали, Unity выдавала ошибку вроде: "Can't add script component because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match".
Это было связано с тем, как Unity связывала скрипты с компонентами в редакторе.
С Unity 2020.3 и новее:
Благодаря обновлениям в Visual Studio Tools for Unity и улучшениям в обработке скриптов, Unity стала более гибкой в отношении именования. Теперь имя файла и имя класса MonoBehaviour могут не совпадать, но при этом класс должен быть корректно определён и не содержать ошибок компиляции.
Например, файл MyScriptFile.cs может содержать класс public class DifferentName : MonoBehaviour, и Unity сможет его распознать, если скрипт правильно импортирован в проект.
Однако рекомендуется придерживаться старого соглашения (совпадение имён) для удобства и совместимости, особенно при работе в команде или с устаревшими версиями Unity.
Ограничения и рекомендации:
Если в файле несколько классов, только один из них может быть публичным и наследоваться от MonoBehaviour, чтобы Unity корректно его обработала.
Вспомогательные классы (не MonoBehaviour) в том же файле должны быть размещены ниже основного класса, чтобы избежать проблем с компиляцией.
Пространства имён (namespace) иногда могут вызывать проблемы с распознаванием классов в старых версиях Unity, поэтому в таких случаях рекомендуется их избегать или проверять настройки проекта.
Если вы используете DLL-библиотеки, то имена классов внутри них также не обязаны совпадать с именем файла DLL, но они должны быть правильно импортированы в проект.
Почему это изменилось?
Обновления в инструментах разработки (например, Visual Studio Tools for Unity) улучшили интеграцию и обработку скриптов, что позволило снять некоторые строгие ограничения.
Unity стала поддерживать более современные подходы к организации кода, что сделало движок более гибким для разработчиков, использующих сложные архитектуры проектов.
Практический совет:
Хотя Unity 2020.3 и новее допускают несовпадение имён, для упрощения работы и избежания потенциальных ошибок рекомендуется:
Называть файлы и классы одинаково.
Проверять отсутствие ошибок компиляции в скриптах.
Использовать последнюю версию Unity и Visual Studio Tools for Unity для максимальной совместимости.
Если вы работаете с более старыми версиями Unity (до 2020.3), обязательно соблюдайте правило совпадения имён файла и класса.
Источник: Информация основана на документации Unity и обновлениях Visual Studio Tools for Unity, в частности, исправлениях, связанных с обработкой классов MonoBehaviour (например, журнал изменений Visual Studio Tools for Unity).
Надо бы западные темы глянуть потому что я последний раз до этого разрабатывал в 2022 и эта ошибка точно была
Я все еще на 21, и вроде как видел в прошлом году
Я прошёл кое какой урок по ТРИ В РЯД.
И недавн узнал, что такие простые игры типа карточные, те же 3 в ряд и коллекторы делают чисто в CONVAS.
И вопросец - а какие профиты от этого? Может там проще как-то с объектами на сцене взаимодействовать благодаря этому и код менее макаронный получается? Ну я не знаю..
Ну и какие подводные камни, т.е минусы? Если брать в качестве примера Кенди Краш какой-нибудь (да, я в курсе у них свой движок).
>И недавн узнал, что такие простые игры типа карточные, те же 3 в ряд и коллекторы делают чисто в CONVAS.
А можно примеры таких игр? А то чет очень странно что бы делать всю игру в Canvas через UI.
Смотрел запись собеса чела на зп 2500, он рассказывал об опыте работы, когда пришлось всю игру переносить из конвас. А до этого она так и существовала в нём. Спросил у неёронки чо знает, грит да, изи игры чисто в конвасе делают. Думайте.
>всю игру в Canvas через UI.
Эм, ну 2д игру можно спокойно делать и через него, есть свои плюсы, есть и минусы.
Если говорить про архитектуру, то вопрос в том и скрипты прям на канвасе вешать или все таки отдельно иерархию геймобджектов делать?
В общем можно с определенными условиями. Зависит от потребностей и желаний.
>>8111
Делал матч 3 в канвасе не по своей воле, переносить было уже поздно. Смысла в этом не вижу, только лишние проблемы когда дело касается порядка отрисовки и шейдеров.
И еще есть такой минус, что канвас перерисовывается полностью при анимациях внутри него и это бьет по производительности, если всяких эффектов слишком много, то уже захочется отказаться от такого оверхеда.
По сути плюс только один и он условный(не особо нужный, потому что тут можно обойтись без канвасов вовсе без проблем) - легче сделать прямое взаимодействие ui и игры.
Например у тебя игра про составление слов, снизу есть панелька с какими-то буквами, которые ты можешь размещать на сетке перетаскиванием. Если все в канвасе - ты прям берешь букву - ведешь ее за пальцем - палец отпускают - ты её же прицепляешь на поле. Без пересоздания каких-то отдельных сущностей в виде спрайтов.
>>8116
> Если говорить про архитектуру, то вопрос в том и скрипты прям на канвасе вешать или все таки отдельно иерархию геймобджектов делать
Ну, на каком-нибудь тайле в матч 3 у тебя должен будет скрипт висеть так или иначе, в идеале просто вью без всякого лишнего.
И отдельный монобех, в который ты закидываешь контейнеры тайлов и всё что нужно.
Соответственно получив все эти данные со сцены, можно уже дальше управлять этим всем извне, всю логику писать независимо от канваса и юи элементов.
Поэтому в целом нерекомендую канвас даже для статичных игр, если их прям всерьез доделывать до релиза с заделом на дальнейшую поддержку.
Если прям простое то может и можно.
суть в том, что у меня простенькая аркада (не вампир сюрвиворс, но похожее, не суть) и несколько десятков юнитов и предметов лута
в итоге, надо на каждого юнита делать файлы анимации типа "покачивания" и атаку в 2-3 фрейма, а подбираемые предметы (по факту - гифки, исчезающие при подборе)
есть ли способ, вместо миллиона мусорных файлов сделать что-то типа "пока юнит идет - спрайт_идет, наклон направо, наклон налево, в цикле, пока юнит атакует - спрайт_удар" а для предметов обойтись "монетка.компонент.спрайт = спрайт_монетка_анимация, зациклить"?
на ум идет только корутины с заменой sprite, но не верю, что нет какого-то готового решения
есть библиотеки для твининга (tween)
будь осторожен, одна из них "в поддержку украины", т.е. там может быть вредоносный код
ответ дикпика
Есть несколько эффективных способов сделать простую спрайтовую анимацию прямо через код без использования Animator:
1. Самописный Sprite Animator (рекомендуется для вашего случая):
csharp
public class SimpleSpriteAnimator : MonoBehaviour
{
public Sprite[] idleSprites;
public Sprite[] moveSprites;
public Sprite[] attackSprites;
[SerializeField] private float frameRate = 0.15f;
private SpriteRenderer _renderer;
private Coroutine _currentAnimation;
void Start()
{
_renderer = GetComponent<SpriteRenderer>();
PlayIdle();
}
public void PlayIdle() => PlayAnimation(idleSprites, true);
public void PlayMove() => PlayAnimation(moveSprites, true);
public void PlayAttack() => PlayAnimation(attackSprites, false);
private void PlayAnimation(Sprite[] frames, bool loop)
{
if(_currentAnimation != null) StopCoroutine(_currentAnimation);
_currentAnimation = StartCoroutine(Animate(frames, loop));
}
private IEnumerator Animate(Sprite[] frames, bool loop)
{
do
{
foreach (var frame in frames)
{
_renderer.sprite = frame;
yield return new WaitForSeconds(frameRate);
}
}
while (loop);
}
}
Использование: Назначьте спрайты в инспекторе и вызывайте методы для смены анимаций.
2. Time-based анимация без корутин:
csharp
public class SimpleAnimation : MonoBehaviour
{
public Sprite[] frames;
public bool loop = true;
private SpriteRenderer _renderer;
private int _currentFrame;
private float _timer;
void Start() => _renderer = GetComponent<SpriteRenderer>();
void Update()
{
_timer += Time.deltaTime;
if(_timer < 0.1f) return;
_timer = 0;
_currentFrame++;
if(_currentFrame >= frames.Length)
{
if(loop) _currentFrame = 0;
else return;
}
_renderer.sprite = frames[_currentFrame];
}
}
3. Для предметов лута (UI-версия):
csharp
public class LootItem : MonoBehaviour
{
public Sprite[] sprites;
public float animationSpeed = 0.5f;
private Image _image;
private int _index;
void Start()
{
_image = GetComponent<Image>();
InvokeRepeating(nameof(Animate), animationSpeed, animationSpeed);
}
void Animate()
{
_index = (_index + 1) % sprites.Length;
_image.sprite = sprites[_index];
}
public void Collect()
{
CancelInvoke();
Destroy(gameObject);
}
}
4. Оптимизация для множества объектов:
Создайте AnimationData ScriptableObject для переиспользования анимаций:
csharp
[CreateAssetMenu]
public class AnimationData : ScriptableObject
{
public Sprite[] frames;
public float frameDuration = 0.1f;
public bool loop = true;
}
5. Альтернативные решения:
LeanTween (ассет из Asset Store) - может анимировать любые свойства через код
DOTween - популярная библиотека для простых анимаций
Shader-based анимация - если спрайты в атласе, можно анимировать UV-сдвигом
Преимущества подхода:
Нет лишних файлов .anim и Animator Controller
Полный контроль над анимацией через код
Легко менять скорость/наборы спрайтов динамически
Можно создавать сложные паттерны анимаций программно
Экономия памяти для простых анимаций
Советы:
Храните разные анимации в отдельных папках (Sprites/Units/UnitName/Animations)
Используйте Sprite Atlas для оптимизации
Для 2D-скелетной анимации посмотрите на Unity-пакет "2D Animation"
Используйте pooling для часто воспроизводимых анимаций
Эти методы особенно хороши для procedural animation и простых циклов. Для сложных персонажей с большим количеством состояний все же стоит рассмотреть использование Animator, но для вашего случая (десятки юнитов с минимальной анимацией) кодовая реализация будет оптимальной.
ответ дикпика
Есть несколько эффективных способов сделать простую спрайтовую анимацию прямо через код без использования Animator:
1. Самописный Sprite Animator (рекомендуется для вашего случая):
csharp
public class SimpleSpriteAnimator : MonoBehaviour
{
public Sprite[] idleSprites;
public Sprite[] moveSprites;
public Sprite[] attackSprites;
[SerializeField] private float frameRate = 0.15f;
private SpriteRenderer _renderer;
private Coroutine _currentAnimation;
void Start()
{
_renderer = GetComponent<SpriteRenderer>();
PlayIdle();
}
public void PlayIdle() => PlayAnimation(idleSprites, true);
public void PlayMove() => PlayAnimation(moveSprites, true);
public void PlayAttack() => PlayAnimation(attackSprites, false);
private void PlayAnimation(Sprite[] frames, bool loop)
{
if(_currentAnimation != null) StopCoroutine(_currentAnimation);
_currentAnimation = StartCoroutine(Animate(frames, loop));
}
private IEnumerator Animate(Sprite[] frames, bool loop)
{
do
{
foreach (var frame in frames)
{
_renderer.sprite = frame;
yield return new WaitForSeconds(frameRate);
}
}
while (loop);
}
}
Использование: Назначьте спрайты в инспекторе и вызывайте методы для смены анимаций.
2. Time-based анимация без корутин:
csharp
public class SimpleAnimation : MonoBehaviour
{
public Sprite[] frames;
public bool loop = true;
private SpriteRenderer _renderer;
private int _currentFrame;
private float _timer;
void Start() => _renderer = GetComponent<SpriteRenderer>();
void Update()
{
_timer += Time.deltaTime;
if(_timer < 0.1f) return;
_timer = 0;
_currentFrame++;
if(_currentFrame >= frames.Length)
{
if(loop) _currentFrame = 0;
else return;
}
_renderer.sprite = frames[_currentFrame];
}
}
3. Для предметов лута (UI-версия):
csharp
public class LootItem : MonoBehaviour
{
public Sprite[] sprites;
public float animationSpeed = 0.5f;
private Image _image;
private int _index;
void Start()
{
_image = GetComponent<Image>();
InvokeRepeating(nameof(Animate), animationSpeed, animationSpeed);
}
void Animate()
{
_index = (_index + 1) % sprites.Length;
_image.sprite = sprites[_index];
}
public void Collect()
{
CancelInvoke();
Destroy(gameObject);
}
}
4. Оптимизация для множества объектов:
Создайте AnimationData ScriptableObject для переиспользования анимаций:
csharp
[CreateAssetMenu]
public class AnimationData : ScriptableObject
{
public Sprite[] frames;
public float frameDuration = 0.1f;
public bool loop = true;
}
5. Альтернативные решения:
LeanTween (ассет из Asset Store) - может анимировать любые свойства через код
DOTween - популярная библиотека для простых анимаций
Shader-based анимация - если спрайты в атласе, можно анимировать UV-сдвигом
Преимущества подхода:
Нет лишних файлов .anim и Animator Controller
Полный контроль над анимацией через код
Легко менять скорость/наборы спрайтов динамически
Можно создавать сложные паттерны анимаций программно
Экономия памяти для простых анимаций
Советы:
Храните разные анимации в отдельных папках (Sprites/Units/UnitName/Animations)
Используйте Sprite Atlas для оптимизации
Для 2D-скелетной анимации посмотрите на Unity-пакет "2D Animation"
Используйте pooling для часто воспроизводимых анимаций
Эти методы особенно хороши для procedural animation и простых циклов. Для сложных персонажей с большим количеством состояний все же стоит рассмотреть использование Animator, но для вашего случая (десятки юнитов с минимальной анимацией) кодовая реализация будет оптимальной.
Тебе не нужны никакие ассеты. Просто напиши свой скрипт, который будет переключать спрайты так, как тебе надо. Вынесешь нужные настройки в редактор.
Бро, напиши сам скрипт, под себя.
Хз, но в дотвине можно сделать sequence и туда последовательно добавлять интервалы и коллбеки
>будь осторожен, одна из них "в поддержку украины", т.е. там может быть вредоносный код
Я помню, что один хохло-эксплойт попал непосредственно в Unity Hub. Если он определял российский IP-адрес, то удалял все файлы на диске.
ватозависимый, чому не в окопе?
И что за хуету ты кинул? 0 пруфов, просто мусор какойто.
Я же поэтому и написал что все это пиздешь не стоящий ничего.
От мелкобуква пиздабола отмываться не надо.
да не трясись ты, гнилушка
https://toxic-repos.ru/malware
https://2ch.hk/s/res/3574308.html#3574308 (

>Не надо нести дезинформацию
Но это реальная новость. Плюс совсем недавно было нечто похожее в среде мододелов.

854x480, 0:11
я только щас понял, что ты тролишь
Ты создаешь анимации, даешь названия, потом в коде вызываешь аниматор и запускаешь как хочешь по названию.
Ну типа
if (isKeyJump) animation.Play("jump")
Это лучше всего, но почему-то на ютубе готовы трахаться даже с деревом ради спрайтовых анимацией. Редко ведел что дергают из кода, хотя кодом задают состояния.
> Ты создаешь анимации, даешь названия, потом в коде вызываешь аниматор и запускаешь как хочешь по названию.
Хорошо, как создать анимацию, не создавая файл .anim? Ну, то есть, то, что я спросил буквально первой строкой коммента, на который ты отвечал
дефолтные Animation Controller я юзал изначально, речь как раз о том, что у меня пара десятков объектов, которые из себя представляют тупо выпадающие из мобов "гифки" и на каждую пилить по файлу и animator-у уже вымораживает
> Стоит ли в Destroy сделать отписку?
стоит, но это всё равно бессмысленная трата одной строки, утечки в данном случае не будет

Я хочу сделать анимацию без создания файла .anim и, в идеале, привязки Animator Controller к каждому объекту
Вот пример картинки из интернетов
в Юнити это уже импортнется в виду sprite-multiple, нарезанное на кадры и во время игры у него нет ничего, кроме зацикленного спрайта
а таких предметов (тупо зацикленный значок монетки/бумажки/алмаза и тд) много и на каждый нужно создать .anim-файл, расставить кадры по таймлайну, настроить скорость и тд
вот и интересуюсь, есть ли способ это автоматизировать до уровня "создать_подбираемое(тип, спрайт)", чтобы в нужном месте рисовался один и тот же префаб с разными параметрами и по названию спрайта подтягивалась зацикленная анимация - а добавление новых коллектибсов в игру упростилось бы до "закинул спрайт в файлы и прописал в коде, что происходит при подборе монетки нового цвета"
>>8321
штука выше на твинах возможна? почитал про нее, на первый взгляд оно анимирует движение по координатам/траекториям, а не спрайты
> штука выше на твинах возможна? почитал про нее, на первый взгляд оно анимирует движение по координатам/траекториям, а не спрайты
Да
>>8207
> в дотвине можно сделать sequence и туда последовательно добавлять интервалы и коллбеки
Ты можешь сделать монобех в который будешь перетаскивать последовательность картинок и интервал кадров и вот так это реализвать универсально

1280x720, 0:05
Справедливое замечание. Но тут есть нюанс. Мне интересно, как будут развиваться будущие поколения, когда ИИ-чатботы станут повсеместными и дети в них будут сидеть с "пелёнок". Станут ли эти люди в разы умнее нас или же наоборот - глупее.
>Но тут есть нюанс.
1. Люди научились в общины.
2. Люди научились в огонь.
3. Люди научились в бронзу.
4. Люди научились в земледелие.
5. Люди научились в письменость.
6. Люди научились в электричество.
7. Люди научились в интернет.
8. Люди научились в нейроночек. <- Вы тута
9. Люди научились в генерацию любого контента по одной фантазии.
10. И т.п и т.д.
Все же не забывайте что нейроночки это буквально буст во всех областях человечества. В разное степени поршивости на данный момент, но всеже.
Или просто ты лоускилл, и не понимаешь, что аниматор заебись инструмент для дизайнеров.
А подход через твин полный эквивалент твоей ебли с апдейтом
Съебись отсюда дизайнер комнатный, будет мне еще про лоускилл рассказывать. Зумерки совсем охуели.
Ну да, охуели. Какие минусы?
Да ты еще раз прочитай зачем ему вообще это нужно, это же умора конкретная.

анонсы, это правда? задумался об окне настроек и наткнулся на интересную мысль, как вы вообще реализуете эту жизненно необходимую фичу?
Пост процессинг
Игрок закрыл дверь за собой и при попытке открыть обратно откидывается. Или холодильник/шкаф, такие вообще внутрь не открываются
> Игрок закрыл дверь за собой и при попытке открыть обратно откидывается.
Так и при открвтии обратно в противоположную сторону откроется
> Или холодильник/шкаф, такие вообще внутрь не открываются
Эти без коллайдера
Но да, тема необычная, варианты разные есть что делать
> Так и при открвтии обратно в противоположную сторону откроется
Ток если дверь по середине рамы пихать, иначе она через нее проходить будет, некрасиво. И все объекты переставлять от дверей. Да и вообще в ирл мало какие двери в обе стороны работают..
> Эти без коллайдера
Тогда прямо через камеру пролетает, тоже некрасиво выглядит, когда вся внутрянка текстуры перед глазами проскальзывает. Надо думоть ещё.
>некрасиво выглядит, когда вся внутрянка текстуры перед глазами проскальзывает. Надо думоть ещё.
у камеры есть параметр один, Far что-то там, покрути его
Ну так пусть отталкивает епты, хули игрок стоит на пути. Хотя конечно от игры зависит и вообще чего ты хочешь от жизни и эстетики. Можешь чекать рейкастом игрока если мешает анимации, на паузу анимацию ставить. Если без коллизий, можно шейдером дверь прозрачной делать во время клипания внутрь камеры. Можешь как в думе двери из космоса которые вверх уходят, или как в Японии внутрь стены. Или как в майнкрафте, тупо мгновенная телепортация двери в открытое состояние. Можешь катсценой отбирать управление у игрока и анимировать открывания закрывания дверей с соответствующей анимацией игрока. Вот те шесть способов из моей головы, выбирай, или епта думалку заводи.
В противоположную сторону как уже сказали
Отключать коллайдер во время анимации открытия
Сам игрок будет делать шаг назад когда открыват дверь на себя(ведет к куче проблем)
а ещё лучше просто стопать анимацию открытия или обратно закрывать дверь, как это сделано в играх габена
Так коллайдер камеры и коллайдер игрока могут быть разными в разных слоях
Как же заебала эта параша.
Почему всё что идёт из коробки такое гавно.
Анммация, навигация, физические коллайдеры, материалы всё такое кривое?
Все книги которые я прочитал по юнити, все туториалы, все предлагают какие то кривые решения которые в реальных играх нельзя использовать.
Почему если ты хочешь сделать что то сложне платформера все начинает скатываться в индюшатину.
Причина баха анимация в навмеш агентах, я уже отказался от дерева анимаций и от переходов, у меня аниматор работает только из кода, где я могу запустить любую анимацию, но как сделать так чтобы пока одна анимация не закончилась другая не запускалась? Например как сделать так чтобы мог замахнувшийся на игрока отыгрывал сначала удар, а не срывался на пол анимации и не бежал за игроком. Я знаю есть переходы и дерево, но когда у меня больше 20и анмсаций я не могу разобраться а паутине переходов, поэтому использовал кастомное решение.
>я не могу разобраться а паутине переходов
Ну это только твоя проблема, а не инструмента.
У тебя есть параметры в аниматоре. Что с ними делать сам додумай. Всё там настраивается без проблем.
> у меня аниматор работает только из кода
> но как сделать так чтобы пока одна анимация не закончилась другая не запускалась?
В коде ждать когда закончится в чем проблема? У него есть апи чтобы всю информацию о его текущем состоянии вытащить
> Например как сделать так чтобы мог замахнувшийся на игрока отыгрывал сначала удар, а не срывался на пол анимации и не бежал за игроком
См выше
> Я знаю есть переходы и дерево, но когда у меня больше 20и анмсаций я не могу разобраться а паутине переходов,
Сабстейты, слои
Аниматор это инструмент для отображения анимаций.
Логика - это логика, за тебя её никто не напишет.
Глобально у тебя два подхода
- либо полный контроль со стороны твоего кода и использование аниматора как тупого проигрывателя анимаций -длину анимаций вписывать в конфиг(соответственно код будет четко знать сколько анимация длится без обратной связи, и подстраивать аниматор под свои нужды)
- либо использовать двустороннюю связь и смотреть в аниматоре его реальный стейт со стороны кода и реагировать на него(отключать управление пока чел замахивается)
Программирование персонажа с большим числом анимаций и разных взаимодействий - это не простая задача.
Зачем ты уходил из дерева анимации и полностью переходил в код, когда блядь в стандартном аниматоре проще всего условия делать чтобы одна анимация не начиналась пока не закончилась другая
Ну и в любом случа корутины
> нюфажина плакает что искаропки нет готовой игры и што все надо делать самому, ссылается на книги где говорят что вы вольны делать что хотите вот вам пример, ссылается на туторы которые не являются туторами в прямом смысле, и все это подается с акцентом весомости этих книг и туторов в гейдеве да еще и с нюфажной колокольни. Нюфажина не знает что такое инди. Нюфажина не может понять как сделать так что бы одна анимация проигрывалась после другой. Нюфажина не асилила аниматор и высрала пасту что юнете хуйня потому что он не асилил аниматор
Ну хуй знает анон, ну хуй знает..
мимо годотя зоонаблюдаю
Наместе годоти я бы вообще помолчал, если в юнити хоть есть кривой аниматор с возможностью инверсной кинематики и слоями, годотя так и осталось на уровне нулевых со своими велосипедами и самописными стейт машинами.
>>9001
Да в стороеу корутин я и думал, но я думал, что в самом аниматоре есть возможность отслеживать состояние анимации и если она проигрывается не запускать другую, я пытался сделать это через енумы.
И нет сколько лет я ебался с аниматором, ограничивая себя в колличестве анимации, теперь всё намного проще и быстрее, единственно заметил, что мобы теперь скипают по пол анимации атаки.
>что в самом аниматоре есть возможность отслеживать состояние анимации и если она проигрывается не запускать другую
Есть
>Например как сделать так чтобы мог замахнувшийся на игрока отыгрывал сначала удар, а не срывался на пол анимации и не бежал за игроком
А прикинь, если ты ещё решишь добавить дебаффы, которые будут снижать скорость атаки моба на 50%? И тебе придётся снижать как-то скорость анимации. Или ты решишь добавить мобу бафф "ярость", который будет его временно ускорять и тебе нужно будет вместе с тем ускорить скорость анимации бега моба.
Кто как делает повышение/понижение статов персонажу через рандомные действия/использование предметов?
Я ко всем книжкам и дебафф абилкам леплю лист в котором прописан айди стата и число на которое надо увеличить(уменьшить с минусом)
Может у кого лучше идеии для этого?

https://unity.com/ru/resources/scalable-performant-ui-uitoolkit-unity-6
Unity Technologies выпущена бесплатно 150-страничная электронная книга в формате PDF под названием "UI Toolkit for advanced Unity developer (Unity 6 edition)". Как следует из названия, эта книга довольно подробно описывает недавно выпущенный UI Toolkit. Она на английском языке.
Мы переписали нашу предыдущую электронную книгу по UI за 2021 год с нуля; это новое издание сосредоточено исключительно на функциях UI Toolkit, с новыми разделами, охватывающими возможности Unity 6, такие как привязка данных, локализация и пользовательские элементы управления.
Мы в новом проекте решили остаться на старой UI-системе. Она простая и понятная. А этот UI Toolkit творение сотоны.
Минусов нет.
Более правильный вопрос - а какие возможности? А возможностей пока не хватает. Знаю про реальные попытки применения вайбкодинга, но даже с минимальными приложениями он толком не справляется.
А вот какие-то наброски, либо что-то очень простенькое осилит.
Убивай рандом, который влияет на геймплей.
Я серьёзно, рандомизация это первый признак хренового геймдизайна, одно дело делать толковый рандом выпадения предметов, как в каком нить диабле и другое пихать рандом как в большинстве современных рогаликов.
Диды вообще даже в самых примитивных играх прошлого, несмотря на весь свой программистский скил, вообще юзали только списки и очень редко прибегали к рандому.
Вот есть эрпэгэ с кучей префабов.
Реализовал ручные пулы со списками, т.е когда нам нужен к примеру предмет или противник, чекаем пулл на наличие уже созданого, если находим то обнуляем и отдаем, если нету, то создаем с нуля из списка префабов. После нужного взаимодействия деактивируем и помещяем в пулл.
И у меня таких штук, разных типов много. Это так и должно быть?
Предметы, эффекты глобальные, противники, эффекты локальные в сражениях на мобах и персонаже, таймеры для событий. На каждый тип свой отдельный пулл.
Пулов обычно много и это норма
Но, тут есть нюансы и разные подходы к арзитектуре.
Вот например у тебя по миру разбросаны разные предметы. Например кусок хлеба, меч обычный, меч стальной, и куча всего ещё, счет идет на сотни. Как тогда быть? Сотню пулов делать?
Тут придется либо делать лейзи пулы, которые изначальго пустые, и периолически их подчищать(логично, что в какой нибудь пустыне будут встречаться предсеты, которых нет в лесу, и наоборот, поэтому все зарезервированными нет смысла держать)
Либо, в пуле держать префаб "подбираемый предмет" а его сущность выделить в модель(которая будет содержать афдишник, модельку, материал, коллайдер). Соответственно когда спавним подбираемый предмет у него вызываем метод СетМодел, из которого он вытащит все нужные данные
>Вот например у тебя по миру разбросаны разные предметы.
У меня локации, в каждой локации есть скрипт-список дропа (В самом списке предметы не созданы а лишь ссылки на их префабы из общего списка), пока локация не зачищена предметов как бы и не существует.
Как только должна быть выдана награда, то скрипт пробегает по предметам из дропа, потом сверяется с тем что есть у игрока в инвентаре и если там есть что-то типа зелье лечения или золото то не создает новый префаб, а просто у уже созданного предмета игрока добавлять += колличество.
А так потом чекается пулл и вытаскиваются нужные и передаются игроку, при не нахождении создаются инстансом.
Пулл предметов один. Сами предметы хранятся уже созданные по спискам типа у игрока инвентарь, или в магазине тоже список по аналогии игрока.
Не, я говорил про предметы которые физически существуют в мире валяются
В инвентаре я думаю должен быть только префаб "карточка предмета", которыц отоьражает картинку и количество. Он должен быть в пуле.
Сами предметы в инвентаре должнв зарнмиться в отдельноц структуре данных, а юи ее только отображать посредством этих карточек
Да да, я тя понял, мы об одном и тоже говорим, так и есть по структуре как ты написал.
UI у меня отдельно, префабы отдельно, данные отдельно, все по ООП SOLID.
Двачую
У меня работает так второй вариант, игрок подбирает любую хуйню, а по ади уже строится, что за хуйня и привязывается к герою если это элемент доспеха или оружие или меняет статы если бонус.