Яковлев Илья | Gamedev
4.69K subscribers
253 photos
35 videos
18 files
217 links
Download Telegram
🔥 Как правильно сравнивать объекты? 🔥

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

Как верно заметили в комментариях под предыдущим постом, вот так сравнивать объекты произвольного типа никак нельзя:

 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
35🔥13🐳4👏1
🔥 EqualityComparer - спасительный сравнятор объектов 🔥

Завершаем обсуждение вопроса сравнения объектов
Кто не читал про предыдущие два поста, то первая часть тут, а вторая тут

В предыдущий раз мы понял, что интерфейс 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
🔥83👍106🐳5❤‍🔥11👏1
Судя по реакциям большие длинные статьи заходят по хуже🤯

Нооо, что если завтра выйдет новый небольшой, но интересный видосик?)) Накидайте 🔥, если поддерживаете такую затею👍
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥267❤‍🔥7🐳43👍3💯2👎1👏1🤯1💅1
🔥 Новое видео! Сделай игру безопаснее! 🔥

https://www.youtube.com/watch?v=hIE8gkcfwUI - смотреть тут:)

👉 Недавно разбирали базу по интерфейсу IDisposable, теперь углубляемся в эту тему и смотрим как можно сделать код удобнее и безопаснее:)

👉 Кроме того в этом видео объявил о хорошей для многих новости, так что обязательно посмотрите:)

Ну и ставьте 🔥 если ждете больше контента:)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥50🐳86
🔥 Новый поток обучения! Что, где и когда?) 🔥

Наконец-то определились даты нового потока обучения на Unity adventure и я рад ими поделиться:)

🖥 Старт записи на поток будет 14 августа

🔜 Старт же самого обучения будет 8 сентября

Причем этот поток будет особенным!) Несмотря на то, что обучение уже сейчас хорошо выстроено, я всегда ищу как его можно улучшить. Так вот следующим этапом станет добавление опции менторства на новом потоке - это позволит плотнее взаимодействовать с учениками, лучше доносить материал, оперативнее решать возникающие в ходе обучения вопросы и, в целом, такое усиление улучшит процесс обучения по всем фронтам. Я долгое время размышлял над этой возможностью, так как это довольно ответственное решение, с большим количеством возникающих вопросов, но смог по итогу прийти к наилучшему варианту, который позволит мне остаться интегрированным в обучение, и при этом сильно улучшит сервис

Но подробнее про новую опцию я расскажу позже в отдельном посте, а сейчас можете поставить 👍 к этому сообщению и подробнее ознакомиться с информацией и программой курса на сайте -> жмакнув сюда <-
Please open Telegram to view this post
VIEW IN TELEGRAM
45🤣4🔥2🐳2👎1
🙁 Я задолжал... 🙁

И самое ужасное, что задолжал я вам, друзья.

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

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

Для видеороликов есть довольно много идей на ближайшее время, так что вместо этого я предлагаю завтра в 18:30 собраться на стриме, пообщаться и провести ревью нескольких работ. Я отобрал варианты, которые будет полезно и интересно посмотреть довольно широкому кругу разработчиков, поэтому, думаю, получится довольно интересный стрим

Надеюсь на ваше понимание и поддержку 🔥 под этим постом

p.s. ждите завтра ссылочку
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥857❤‍🔥5🐳3👍2
Ревью кода подписчиков уже сегодня

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

🔜 Начало в 18:30 МСК

👀 Где смотреть?

✔️ Можно на ютубе
✔️ Можно на твиче

p.s. да да, вроде разобрался как сделать мультистрим на разные платформы:)))
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥374🐳3
🔥 Через 10 минут стартуем! 🔥

🔣 Нужна ли стейт машина в игре?

🔣 Что делать с главным меню?

🔣 Нужны ли контейнеры и прочие усложнения?

Сегодня разберем кучу разных вопросов на примере ваших проектов!)

Поэтому подключайтесь:

👀 СМОТРЕТЬ НА YOUTUBE

👀 СМОТРЕТЬ НА TWITCH
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥173🤩2🐳21💅1
Поехали!
Please open Telegram to view this post
VIEW IN TELEGRAM
21🐳4
Спасибо всем кто пришел! Было круто:) Пошел отдыхать😅
Please open Telegram to view this post
VIEW IN TELEGRAM
64👍5🔥4🐳3🤝2🤩1💅1
❤️Мой первый проект❤️

Откопал из интереса свой первый проект (до сих пор в шоке, что он как-то сохранился до сегодняшнего дня, прошло лет 11-12 или около того)

И, как у многих, первым моим проектом был кликер😅 Но КЛИКЕР С ДУШОЙ!!!

в 2007-2010 был популярен мультфильм по шаману кингу и я откопал пиксельную игру по нему (по моему на gameboy выпускалась, точно не помню), которую смог запустить на эмуляторе с ПК. На этом эмуляторе можно было отключать некоторые слои рендера картинки и я брал, скринил экран, вырезал по кадрово нужные спрайты и использовал их для игры))) А некоторые спрайты смог просто найти в интернете и нарезать

В итоге играть интересно до сих пор!) Более того, проект без проблем запустился после апдейта версии эдитора, что вообще фантастика😂

Но, самое интересное, что тогда я вообще почти ничего не знал по программированию, собирал все кусочками по гайдам и каким-то своим соображениям. В итоге привело это к очень интересной системе спавна монстров (фото 2😂). if вложенный 25 раз! Ты действовал наверняка, да?)))

Однако игра работает и тогда я получал море удовольствия от процесса изучения движка! И пусть были перерывы в обучении, пусть почти ничего не получалось с первого раза, я рад, что пришел туда, где сейчас нахожусь и этот КРИВОЙ, но первый шаг, возможно был определяющим

А вы помните свои первые проекты?) Делитесь в комментариях🔥

p.s. геймплейчик приложил в комментах)))
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83😁118😍2🐳2
⭐️ Screenshot Saturday! ⭐️

ЧУТЬ НЕ ЗАБЫЛ!)

Делимся и пиарим свои наработки/проекты/идеи в комментариях!🔥🔥🔥

p.s. завтра ждите бомбовый анонс, о котором договаривались на последнем стриме!)
🐳1110🔥1
⚡️С 0 ДО JUNIOR+ К 2026 ГОДУ. Детальный roadmap ⚡️

На последнем стриме мы договорились, что я подготовлю подробный вебинар с дорожной картой развития в сфере геймдева и вот анонс данного мероприятия!

🔜 Когда?

12 и 13 августа, в 19:00 по МСК на прямой трансляции (вебинар пройдет в 2 дня, так как информации будет реально много)

🖥 Как попасть?

Для регистрации на вебинар нужно просто перейти к боту ТЫКНУВ СЮДА и нажать кнопочку "попасть на вебинар". Ссылка на трансляцию автоматически придет в день вебинара

👀 Что будет?

Впереди нас ждет 2 дня четких инструкций, следуя которым ты поймешь:

👉 Как продуктивнее всего изучать C# + Unity
👉 С какого этапа можно начинать проходить собеседования
👉 Как делать пет проекты, чтобы не стоять на месте и показывать релевантный опыт в резюме
👉 Нужно ли засорять голову паттернами?
👉 Насколько необходимо знание архитектуры junior разработчику и как вообще постигать эту область

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

🎁 Ну и конечно же, по традиции будут подарки:

👉 Ссылки на все озвученные в ходе вебинаров обучающие материалы
👉 Ссылка на полный и удобно составленный roadmap, двигаясь по которому вы сможете дорасти до junior+ уровня и выше

❗️А также для тех, кто будет вживую присутствовать на мероприятии откроется предварительная запись на Unity adventure, чтобы вы могли спокойно забронировать место и получить особый крутой бонус (скоро отдельно расскажу какой)

Думаю, получится очень крутой вебинар, который зарядит вас энергией и задаст вектор развития к новому году! Буду всех ждать🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥40🐳21👍1🤮1
🔥 Новое видео! Паттерны в Unity 🔥

Долго не хотел касаться этой рубрики на канале, но последний стрим с разбором кода подтолкнул к такому формату.

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

✔️ Оставьте комментарий на ютубе под видео - как вам такой формат и стоит ли делать дальше подобные разборы. Буду признателен

Смотреть тут -> https://www.youtube.com/watch?v=a2nmESFU0Ew

p.s. проект в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61🐳32
Время для новых лайфхаков

Не забудьте поставить 🔥, если хотите больше полезных лайфхаков

В Unity есть такой класс, как EditorSceneManager

🧐 В чем его фишка?

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

✔️ Так вот на основе этого можно писать себе очень удобные инструменты, например, вот простейший вариант использования - открытие первой сцены из списка BuildSettings. Этот простой скриптик позволяет независимо от текущей открытой сцены по нажатию кнопки "Play" в редакторе запускать первую, как если бы вы запускали готовый билд. Очень удобно, особенно если первая сцена это bootstrap с которой должна запускаться и инициализироваться игра. Ну и потенциально можно добавить еще больше плюшек для удобства, конечно же)

[InitializeOnLoad]
public static class EntryPointSceneAutoLoader
{
static EntryPointSceneAutoLoader()
{
if (EditorBuildSettings.scenes.Length == 0)
return;

EditorSceneManager.playModeStartScene = AssetDatabase
.LoadAssetAtPath<SceneAsset>(EditorBuildSettings.scenes[0].path);
}
}


p.s. Как понятно из названия данный функционал работает только в эдиторе, поэтому не вздумайте использовать вне папки Editor или без соответствующих деректив
#if UNITY_EDITOR


#лайфхаки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10210🐳3
Менторство

Как обещал в недавнем посте рассказываю подробнее про опцию менторства на новом потоке!

🔣 Почему это круто?)

На самом деле все просто. Это улучшит предоставляемый сервис по всем фронтам:

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

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

👉 Кроме того все также останутся еженедельные вебинары со мной лично, чтобы я мог контролировать сложные моменты программы и следить за вашими вопросами и прогрессом

👉 Также на этом потоке я не буду поднимать стоимость обучения из-за введения этой опции и она будет доступна на всех тарифах

А теперь немного лирики для тех, кому это интересно)

Я долгое время думал о введении менторов на курс, так как понимал, что хоть обучение получается и качественное, но тем не менее замечал некоторые проседающие в сервисе моменты. Например, мог иногда сам проморгать какой-то вопрос в чате или сильно задержаться с ответом. Также я прекрасно понимаю, что иногда хочется чаще созваниваться вживую для решения каких-то проблем в разработке или, например, можно еще сильнее ускорить процесс сдачи домашних заданий. Я старался максимально сглаживать все углы самостоятельно и, как видно по отзывам, эти моменты перекрывались остальными плюсами обучения с лихвой. Тем не менее вводить каких попало менторов в большом количестве, просто чтобы увеличить охваты учащихся с первых потоков было бы губительной затеей. Так что я решил пойти по логичному и понятному пути, хоть и довольно долгому. Сначала вылизываю весь процесс обучения, а потом качественно наращиваю вокруг этого сервис, просто постепенно дополняя и улучшая то, что уже хорошо работает и, что самое главное, я прекрасно знаю как оно работает. Так что на этом потоке будут работать менторы с которыми я знаком и экспертизе которых я доверяю, более того, мест на потоке также будет ограниченное количество, чтобы все нововведения можно было четко проконтролировать
Я думаю вы замечали, что я не занимаюсь агрессивной рекламой, не обещаю горы золота просто потому что вы купите обучение, а предоставляю только открытый материал, основанный на реальном опыте - именно по этой причине люди приходят на обучение и именно по этой причине не было ни одного скандала или каких-то разбирательств - и я этим дорожу🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
24👍6🔥3🐳2
🔥 Что делаем со студией? 🔥

Со старта работы над студией прошло чуть больше полугода.
Тяжелый это конечно процесс...))

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

Тем не менее и с ограниченными ресурсами сформировали небольшую команду, за это время по собирали несколько прототипов, обдумали разные идеи, и в итоге решили остановится на следующем:

👉 Нет смысла делать кеж/гипергеж и пытаться выезжать на рекламе. Этот подход умер, либо для его окупаемости надо фигачить по 50 прототипов и смотреть приносит ли что-то результат. В нашем случае просто не хватит ресурсов таким заниматься (да и не особо хочется, честно говоря). Поэтому будем вкладываться в 1-2 два проекта, но проекты будут более сильные и интересные
👉 Сосредоточимся на 2 основных проектах и будем в долгую их развивать, наполняя контентом, социальными механиками, асинхронными мультиплеерными фишками и тд. Понятное дело это не гиперкеж клепать, но собственно требования к навыкам разработчиков не просто так растут
👉 Рук немного не хватает и контент пилить и геймдизайном заниматься/настройками всего и вся, но как только получится, то будем расти в этом плане. Пока стараемся выжимать максимум из того что есть

Наверное не буду растягивать этот пост. Если хотите, то могу подробнее рассказать о проектах, мыслях к которым пришли и тд.

Поставьте 🔥 сюда, если интересно продолжение)

p.s. прикрепил несколько скринчиков из рабочего чата:)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2115🐳4💊3👍2❤‍🔥1😭1💅1