Новая часть по продвинутому использованию корутин! Дальше - юнитаски:)
Жду поддержки на новом видосе! Насколько я знаю для ютуба важно время просмотра, поэтому попрошу досмотреть ролик до титров так сказать
смотреть тут - https://www.youtube.com/watch?v=jyogqdzeEH8
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
ПРОДВИНУТЫЕ КОРУТИНЫ В UNITY! Асинхронность в Юнити от А до Я Ч.2
⚡️⚡️⚡️ Полезные ссылки ⚡️⚡️⚡️
🔎 https://yakovlevgamedev.ru/unity_adventure - обучение разработке игр с нуля до создания полноценного проекта
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут обучающие материалы)
🔎 https://docs.unity3d.com/ru…
🔎 https://yakovlevgamedev.ru/unity_adventure - обучение разработке игр с нуля до создания полноценного проекта
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут обучающие материалы)
🔎 https://docs.unity3d.com/ru…
🔥84👍13❤4🐳3❤🔥1
Media is too big
VIEW IN TELEGRAM
При монтаже видео выше забыл вставить мелкий кусочек про кастомные yield instruction (спасибо, что заметили). Решил из - за такой мелочи не перезаливать и просто выложить этот кусочек:)
👍49🔥18❤8🐳2
Всем привет! Ребят, необычный пост - вакансия:)
Знакомые крутые ребята ищут опытного спеца на верстку UI под довольно мощный проект, немного подробностей ниже
————
Необходим верстальщик интерфейсов с Figma в Юнити, уровень разработчика от Middle+ до Senior
Проект на ПК и Мобильные платформы.
За ориентир по сложности проектов можно брать Delta Force.
Основные требования:
- Умения работать в с паттернами проектирования MVVM, MVP
- Работа только с фронт частью
- Работа на классических канвасах без использования Toolkit
————
От себя скажу, что команда у ребят отличная, без лишней бюрократии и остальных вытекающих
За подробностями писать сюда -> @K0nDeR
Знакомые крутые ребята ищут опытного спеца на верстку UI под довольно мощный проект, немного подробностей ниже
————
Необходим верстальщик интерфейсов с Figma в Юнити, уровень разработчика от Middle+ до Senior
Проект на ПК и Мобильные платформы.
За ориентир по сложности проектов можно брать Delta Force.
Основные требования:
- Умения работать в с паттернами проектирования MVVM, MVP
- Работа только с фронт частью
- Работа на классических канвасах без использования Toolkit
————
От себя скажу, что команда у ребят отличная, без лишней бюрократии и остальных вытекающих
За подробностями писать сюда -> @K0nDeR
🔥26🐳12👍9❤2
Псс, живые люди тут еще есть?)
А то хочется новый видосик залить🔥
А то хочется новый видосик залить
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥333🤯29👍26👻10👌9🤔7❤6🐳4🌚4🥰3💋1
https://youtu.be/bisGKyU1Kyc <- смотреть тута
Говорим про очистку и деинициализацию игровых сущностей (очень важные моменты для избежания багов), и как это все организовать с помощью IDisposable. Ну и некоторые другие фишки смотрим, естественно:)
Поддержите видос лайком, комментарием и временем просмотра, а с меня новый контент!)
p.s. Проект в комментариях:)
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Твоя главная ошибка в очистке игры! IDisposable в Unity!?
⚡️⚡️⚡️ Полезные ссылки ⚡️⚡️⚡️
🔎 https://yakovlevgamedev.ru - обучение разработке игр (запись на следующий поток стартует в августе)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут лежит проект)
📝Сегодня начнем разбираться в теме деинициализации…
🔎 https://yakovlevgamedev.ru - обучение разработке игр (запись на следующий поток стартует в августе)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут лежит проект)
📝Сегодня начнем разбираться в теме деинициализации…
🔥71❤6🐳6👍4👏1
Что-то тихо, давайте пока я готовлю новый контент на следующую неделю, узнаем немножко нового о Unity
Когда в проекте появляется куча разных файлов, текстур, контента и так далее, то пользоваться папкой проекта для поиска нужных ассетов становится все сложнее и сложнее, однако в юньке из коробки предусмотрены некоторые вещи для упрощения вашей жизни, которыми мало кто пользуется
👉 На самом деле если нажать на небольшую кнопочку возле строки поиска на вкладке проекта (фото 1), то у вас вылезет довольно удобное большое окно для поиска сразу с некоторыми удобными тегами (фото2).
👉 Но и это еще не все! На самом деле при поиске (как в этом окне, так и просто в поисковой строке на вкладке проекта) можно использовать дополнительные команды фильтраций, например команда t:texture выдаст вам все текстуры в вашем проекте (фото 3)
👉 Понятное дело, что команда такая не одна доступна и там много всяких вариаций, поэтому если интересно узнать подробнее, то можно почитать небольшую доку вот ТУТ
Вот в целом и все:) Надеюсь поиск нужных ассетов в проекте теперь станет для вам более приятным занятием)
p.s. 🔥 ставим, если хотим больше полезностей:)))
#лайфхаки
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥144❤9👍8🐳3💅1💘1
https://www.youtube.com/watch?v=aGr9dGLq5qc - смотреть тут:)
👉 Сильно старался донести все максимально доходчиво, начиная с самого начала) Поэтому надеюсь вы поддержите видос, лайком, комментарием и временем просмотра)
👉 В комментариях лежит обещанный проект с инкапсулированной реализацией примера и небольшая пояснялка
👉 А также как обещал в видео (обязательно посмотрите) на днях начнем обсуждать тему безопасного сравнения объектов, так что будьте готовы:)
Ставьте 🔥 если ждете больше контента:)
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Это изменит твой подход к разработке игр! Реактивность в Unity. Разбираемся с 0
⚡️⚡️⚡️ Полезные ссылки ⚡️⚡️⚡️
🔎 https://yakovlevgamedev.ru - обучение разработке игр (запись на следующий поток стартует в августе)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут лежит проект и будет обсуждение темы из видео)
🔎 https://y…
🔎 https://yakovlevgamedev.ru - обучение разработке игр (запись на следующий поток стартует в августе)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал (тут лежит проект и будет обсуждение темы из видео)
🔎 https://y…
🔥78👍6🐳4❤🔥1💯1
Начинаем обсуждать момент, освещенный в последнем видео по реактивности. А именно проблему сравнения объектов, которая там возникает.
Если не смотрели последний видос, то обязательно посмотрите:) Ну и
Мы знаем, что все типы в .NET, в том числе value type, такие как float, int и тп. являются неявно унаследованными от класса Object.
Т.е. это значит, что любой объект (неважно value type или reference type) мы можем скастить к типу object без зазрения совести
int number = 42;
object obj = number;
И смотрите в чем тут интересность. Дело в том, что object – это класс, а значит все таки ссылочный тип.
И получается, что я каким-то образом, int, который является структурой, т.е. value type могу засунуть в reference type переменную - как это вообще возможно?
Так вот как раз такой процесс, когда мы value type кастим к ссылочному типу, т.е. процесс преобразования value type значения к reference type и называется упаковкой (boxing).
А когда я делаю обратную операцию, т.е. пытаюсь ссылочный тип скастить к valueType обратно, то происходит распаковка (unboxing)
int number = 42; // Значимый тип
object obj = number; //boxing (упаковка)
int unboxedNumber = (int)obj; //unboxing (распаковка)
И на первый взгляд ничего плохо нет, все работает, компилятор не жалуется, но не все так просто:)
Упаковка и распаковка вызывают накладные расходы по производительности, т.е. магии не происходит. При боксинге в куче выделяется новый объект, в который упаковывается значение, а процесс анбоксинга извлекает тип данных из созданного объекта (фактически создается просто новый ненужный объект в куче каждый раз). Т.е. понимаете, да? Тут все не так просто как при обычном касте тех же классов и частые подобные процессы могут генерировать кучу мусора, которую сборщик мусора должен будет разгрести
Кроме того подобные ситуации возникают и при реализации интерфейсов на структурах, так что надо быть осторожным (но это отдельный вопрос, не будем его пока трогать)
Напомню, что выглядела она вот так:
if(_value.Equals(oldValue) == false)
Changed?.Invoke(oldValue, _value);
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥38❤9👍4🐳3
псс, кажется у кого-то сегодня день рождения (да, я люблю загадки)
Спасибо всем, кто остается со мной все эти годы, несмотря на нестабильную подачу контента:))) К сожалению еще не нашел где взять 25-й час в сутках, но я все еще продолжаю поиски
Надеюсь в этот день у вас такое же хорошее настроение как и у меня, а если нет, то возьмите немножко моего, на сегодня запас точно есть)))
И еще знайте что монтируется пара новых уроков (может быть кому-то это поднимет настрой😄 )
p.s. не люблю вот эти штуки про то чего я достиг за год и какой я крутой, лучше поговорим о чем-то более интересном позже на стримах и в отдельных постах - есть некоторые планы на ближайшие недели:)
p.s.s поздравления, конечно же, принимаются😍
Спасибо всем, кто остается со мной все эти годы, несмотря на нестабильную подачу контента:))) К сожалению еще не нашел где взять 25-й час в сутках, но я все еще продолжаю поиски
Надеюсь в этот день у вас такое же хорошее настроение как и у меня, а если нет, то возьмите немножко моего, на сегодня запас точно есть)))
И еще знайте что монтируется пара новых уроков (может быть кому-то это поднимет настрой
p.s. не люблю вот эти штуки про то чего я достиг за год и какой я крутой, лучше поговорим о чем-то более интересном позже на стримах и в отдельных постах - есть некоторые планы на ближайшие недели:)
p.s.s поздравления, конечно же, принимаются
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉205🔥17❤12👏4🤩3🐳2❤🔥1
Продолжаем обсуждение проблем, возникших у нас при реализации реактивности
Кто не читал про боксинг/анбоксинг, то первая часть тут
Как верно заметили в комментариях под предыдущим постом, вот так сравнивать объекты произвольного типа никак нельзя:
if(_value.Equals(oldValue) == false)
Changed?.Invoke(oldValue, _value);
Как минимум в таком случае мы сталкиваемся с проблемами боксинга/анбоксинга, т.к. стандартный equals принимает object. И вот вопрос: "А как тогда правильно сравнивать объекты?"
Ответ на этот вопрос - использование интерфейса IEquatable<T>, предназначенного для определения алгоритма сравнения объектов указанного типа. Он находится в неймспейсе System и выглядит так:
public interface IEquatable<T>
{
bool Equals(T other);
}
Казалось бы, в чем разница с обычным bool Equals(object obj)? А разница в универсальном параметре. Например, если мы при реализации этого интерфейса укажем тип int, то и метод Equals будет принимать именно int для сравнения. И получается, что никакого боксинга в таком случае не будет, т.к. принимается не object, а явно int - это как раз именно то, что нам и надо)
И в реализации нашего универсального ReactiveVariable мы можем теперь взять, и ввести ограничение на этот интерфейс примерно вот так
public class ReactiveVariable<T> where T : IEquatable<T>
И благодаря такому ограничению теперь при сравнении будет использоваться Equals относящийся именно к интерфейсу IEquatable, а значит боксинги, анбоксинги и тп. нам больше не страшны
НО!
Такой вариант на самом деле неидеальный, и опять же вопрос к вам, дорогие подписчики, какие есть варианты почему? Чем может быть неудобно такое решение?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤34🔥12🐳4👏1
Завершаем обсуждение вопроса сравнения объектов
Кто не читал про предыдущие два поста, то первая часть тут, а вторая тут
В предыдущий раз мы понял, что интерфейс IEquatable<T> очень хорошо подходит для сравнения объектов, но при этом ограничение универсального типа таким интерфейсом на нас не очень устраивает:
public class ReactiveVariable<T> where T : IEquatable<T>
Тут есть ряд причин, которые мы разобрали в комментариях (сторонние типы могут не реализовывать этот интерфейс, обязательно надо будет на всех своих типах реализовать этот интерфейс, даже если нет особой необходимости и так далее)
Соответственно надо выдумывать что-то другое. И в итоге мы приходим к следующему типу из System.Collection.Generic:
public abstract class EqualityComparer<T> : IEqualityComparer<T>, IEqualityComparer
{
protected EqualityComparer();
public static EqualityComparer<T> Default { get; }
public abstract bool Equals(T x, T y);
public abstract int GetHashCode(T obj);
}
И соответственно мы можем наследоваться от этого EqualityComparerа и делать свои реализации сравнения для разных типов, переопределяя методы Equals и GetHashCode. Поэтому в реализации реактивности мы можем убирать вообще ограничение на IEquatable и переходить на использование таких вот сравняторов. Отсюда реализация меняется на использование IEqualityComparer
private IEqualityComparer<T> _comparer;
public ReactiveVariable(T value, IEqualityComparer<T> comparer)
{
_value = value;
_comparer = comparer;
}
public T Value
{
get => _value;
set
{
T oldValue = _value;
_value = value;
if (_comparer.Equals(oldValue, value) == false)
Invoke(oldValue, value);
}
}
Но, согласитесь, под каждый тип реализовывать свой сравнятор и пихать его при создании реактивной переменной - тухлая затея (просто далеко не всегда это нужно). Поэтому стоит обратиться к свойству Default у EqualityComparer. Оно делает следующее: автоматически возвращает подходящий компоратор для сравнения объектов указанного типа. И если тип реализует IEquatable (мы все таки не просто так про него говорили), то для сравнения как раз передается реализация с использованием Equals из этого интерфейса. И получается, что мы можем особо не заморачиваться с реализациями своих компораторов, если это не нужно, и использовать свойство Default, которое все сделает за нас. А для этого берем и добавляем в класс реактивности дополнительный конструктор следующего вида
public ReactiveVariable(T value) : this(value, EqualityComparer<T>.Default)
{
}
И получается, если пользователю не хочется задавать свою реализацию компаратора, то будет просто использоваться дефолтный вариант, что нас полностью устраивает
Вот в целом и все секретики грамотного сравнения объектов. И на этом объяснение того, как именно мы пришли к итоговому решению можно закрывать)
p.s. постараюсь больше не душить такими статейками:)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥78👍10❤5🐳4❤🔥1☃1👏1
Судя по реакциям большие длинные статьи заходят по хуже🤯
Нооо, что если завтра выйдет новый небольшой, но интересный видосик?)) Накидайте🔥 , если поддерживаете такую затею👍
Нооо, что если завтра выйдет новый небольшой, но интересный видосик?)) Накидайте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥262❤🔥7👍3🐳3❤2💯2👎1👏1🤯1💅1
https://www.youtube.com/watch?v=hIE8gkcfwUI - смотреть тут:)
👉 Недавно разбирали базу по интерфейсу IDisposable, теперь углубляемся в эту тему и смотрим как можно сделать код удобнее и безопаснее:)
👉 Кроме того в этом видео объявил о хорошей для многих новости, так что обязательно посмотрите:)
Ну и ставьте 🔥 если ждете больше контента:)
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Твоя игра небезопасна! Как использовать IDisposable и using в Unity
⚡️⚡️⚡️ Полезные ссылки ⚡️⚡️⚡️
🔎 https://yakovlevgamedev.ru/?utm_source=youtube - обучение разработке игр (старт записи 14 августа)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал
📝Некоторое время назад я выпускал видео, где разбиралась база по…
🔎 https://yakovlevgamedev.ru/?utm_source=youtube - обучение разработке игр (старт записи 14 августа)
🔎 https://t.me/yakovlev_gamedev - основной telegram канал
📝Некоторое время назад я выпускал видео, где разбиралась база по…
🔥46🐳7❤5
Наконец-то определились даты нового потока обучения на Unity adventure и я рад ими поделиться:)
Но подробнее про новую опцию я расскажу позже в отдельном посте, а сейчас можете поставить
Please open Telegram to view this post
VIEW IN TELEGRAM
❤37🤣4🔥2🐳2👎1