Яковлев Илья | Gamedev
4.69K subscribers
252 photos
35 videos
18 files
216 links
Download Telegram
псс, кажется у кого-то сегодня день рождения (да, я люблю загадки)

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

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

p.s. не люблю вот эти штуки про то чего я достиг за год и какой я крутой, лучше поговорим о чем-то более интересном позже на стримах и в отдельных постах - есть некоторые планы на ближайшие недели:)

p.s.s поздравления, конечно же, принимаются😍
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉208🔥2013👏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
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
🔥60🐳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
🔥9910🐳3
Менторство

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

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

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

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

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

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

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

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

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