Кот и код
564 subscribers
178 photos
31 videos
1 file
97 links
Про разработку на Unity и .Net, радость и боль программирования.
Автор: @KotikovD

Про искусство и игрострой:
@svolochandborshch
Download Telegram
Про плохую практику возвращать null из методов. Разберем на примере.

Если метод, например, имеет такую сигнатуру:
QuestData GetQuestData(string questId)

Вы, когда его вызываете совершенно не рассчитываете получить null. Но бывает, что метод при этом может вам его вернуть не показав ошибки или не упав. Не зная этого вы растиражируете это значение по коду и упадете неизвестно где. И от этой рандомной точки нужно будет вернуться к этому методу в обратном направлении затратив время на поиск ошибки. Это потеря времени просто, чтобы узнать, что например, ошибка в данных и такого questId не существует.

Плохая реализация выглядит так:
QuestData GetQuestData(string questId)
{
if (_quests.TryGetValue(questId, out QuestData data))
return data;

return null;
}


Если у вас один такой метод или малый проект, то это особо может и не страшно (но точно неудобно). Те кто не обращают на такие мелочи внимание, далее как правило накручивают еще больше подобных методов и неустойчивость кода растет очень быстро.

Это плохо в первую очередь потому, что ошибка происходит, но делает это втихую — не сообщая ничего. Во-вторых заставляет вызывающий код делать проверки вида if (questData != null) везде где этот метод вызывается, а это повсеместный мусор. И, конечно, замедляет разработку.

Реализация чуть лучше:
QuestData GetQuestData(string questId)
{
if (_quests.TryGetValue(questId, out QuestData data))
return data;

throw new Exception("Quest id '{questId}' not found.")
}


Тут мы уже узнаем, что у нас ошибка в данных. Внешние проверки результата уже не нужны — это хорошо. Но это все еще плохо потому, что в реальности ошибка скорее всего должна быть известна, но не ломать игру.

Хорошая реализация:
bool TryGetQuestData(string questId, out QuestData data)
{
return _quests.TryGetValue(questId, out data);
}

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

- Вы не тратите время и мысленно не "спотыкаетесь" когда пишите код, при работе с подобными методами. Это дает скорость в работе. Вам не надо заходить в методы и проверять их реализацию. Такая фобия может развиться, стоит вам найти 3-4 метода в проекте, которые почему-то неявно возвращают null.

- Например, у вас из 1000 есть целых 10 не валидных questId, которые вы передаете в метод. В варианте с возвращением null или throw new Exception — вам надо будет 10 раз запустить игру, чтобы их найти. В варианте, где вы очевидно обрабатываете отсутствие данных и, например, выводите лог, то вы узнаете все 10 неверных questId за один запуск. Это снова экономия времени.

- Делает код чище и проще. Меньше лишних проверок, меньше строк и снова буст к простоте проекта и скорости разработки.

#техничка@cat_and_code
Поддержите автора лайком или отправьте пост другу
Предложить тему для поста
👍114🗿32🤣11
Комментарий в рабочем легаси коде, который ОЧЕНЬ предостерегает
🤣104🗿1
Достаточно активный срач содержательная дискуссия была под постом про TryGet. Мне понравилось. Я в ней поделился советом, у которого образовались и противники и согласные.

И я тут подумал, может у тебя лично, дорогой подписчик, тоже есть какой-то свой совет, который ты считаешь важным? Или какой-то приём/подход, который ты хотел бы проверить на прочность? Может быть тебе интересно узнать, на сколько он спорный и что об этом думают другие?

Предлагаю такую штуку — желающие поделиться могут написать мне в ЛС, изложить свой совет/рекомендацию удобным способом, я оформлю вашу мысль, подготовлю пост и опубликую на канале. Вам возможность понаблюдать со стороны, не вступая в дискуссию лично (или наоборот с указанием авторства вопроса). Желающим критиковать, шутить и троллить — широкое поле для деятельности, велком. Остальным польза в виде разных мнений на вопрос.
233🔥2
Media is too big
VIEW IN TELEGRAM
Новости из страны инди разработки. Singletone понемногу преображается.

Сейчас этап создания основных механик, но совсем без контента очень сложно принимать решения по развитию визуала. Добавился URP, чтобы художник мог играться с эффектами и начать формировать наш стиль. Тестовая модель нпс тоже показала, что высоко полигональные персонажи нам не пойдут. Мы не собираемся все выводить под стиль PS1, но тем не менее от реализма мы будем далеко, а к конструктивизму и авангарду 20 века — близко.

Пока, то что на видео это еще даже не попытка в визуал, а первые черновые этапы. Модель — это Петр с Mixamo и диалог написанный по инициативе Copilot (все-таки нейронки что-то знают).

В общем у кого тоже проекты на ранних этапах, как у вас идет? Не пасуйте перед количеством работы? Я видел на других каналах иногда делаются посты, типа "скриншот прогресса". Чтобы в комменты все желающие могли накидать прогресс по своему проекту за последнее время и подбодриться (или погрустить вместе, тут как повезет). Есть у нас тут что-то делающие и желающие делиться прогрессом? Думаю может тоже сделаем такую рубрику.
#девлог@cat_and_code
🔥731
Чисто я под конец проекта
🐱🐈
Please open Telegram to view this post
VIEW IN TELEGRAM
12😁7😭3👍11
Пора завершать историю с приставкой. В общем мы ее собрали и она даже стабильно работает.

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

Но если о плюсах:
- Фантомная подсветка сквозь двойную тесселяцию Вороного. Естественно — зеленая.
- Приставка придумана так, чтобы стоять в узкой полке под телевизором (боковые панели не видно). Здесь получилось — скучность ровных поверхностей будет скрыта.
- Хорошее охлаждение, нормальный олдскульный вентилятор и шум на уровне CD-привода при разгоне диска.
- Смена карты ОС без разбора корпуса. Это важно, так как внутри универсальная Raspberry Pi.
- Наличие AV выхода, я даже проверил 1 раз на ЭЛТ-телевизоре, что все работает. Не знаю зачем, но возможность есть.
- Куча эмуляторов разных платформ и необходимость потратить времени для установки и настройки игры в среднем в 3 раза больше, чем будешь в нее играть.
- Центральную кнопку так и не доделали. не хватает декоративной пластины.

В общем я доволен приключением, но дизайнером в Apple нас Джуниором вероятно не возьмут 😐
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥204😁3
Видео разбор технических трудностей при создании Принца Персии 1989 года для Apple II.

Мне очень нравится иногда погрузиться в историю и нюансы, с которыми сталкивались программисты тех лет. Например, банальный объем памяти, максимальная бедная "IDE" для написания кода, обработка изображения платформой как байтов, а не пикселей и обходы аппаратных ограничений для достижения плавной красивой графики. Отдельные слезы — это плата видеозахвата. После просмотра сразу как-то легче на душе и технические проблемы уже не кажутся проблемами 😼

Youtube - Принц Персии: разбираем код гениальной игры, вытирая слезы счастья
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥2
Media is too big
VIEW IN TELEGRAM
Больше всего мне нравится писать сюда девлоги, особенно когда проекты не захиревают. Но заранее это неизвестно 🖼

У Singletone сейчас идет этап создания базовых механик, избавления от лишних идей и составления ГДД. Игра будет из категории нарративных, будет формировать особый многослойный опыт исследования и очень тонкие эмоции.

Невероятно сложно придумать исследовательский геймплей, который при этом максимально старается уйти от банального лутинга, поиска "ключей" и чтения записок. Но успехи есть. Мое почтение, но на данный момент наши режиссёр и сценарист описали основной стержень игры в 116 страниц. Я постепенно читаю и сегодняшней цитатой из документа объявляю фразу, которая звучит как угроза:

«На данном этапе никакой поэзии высокой плотности»

А из конкретного:
1. За этот период мы успели перейти с BuiltIn на URP и затем вскоре на HDRP. Если более человеческим языком — красиво будет, а на мобилках игры не будет.

2. Сделал шейдер для диалога по радио с завязкой эффекта помех на гистограмму звука. Как вам?
#девлог@cat_and_code
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13522👍11
Есть ли на канале те старожилы, которые припомнят, что я пробовал сделать подкаст?

Тогда был первый опыт в этой теме. Тогда я уперся. И потом отложил тему, долго думал. Спустя время мысли привели меня к выводу, что я не хочу ничему учить в подкасте, бежать за трендами и инсайдами или транслировать какие-то заковыристые специализированные темы.

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

Поэтому, если у вас есть желание нас поддержать, а, в последствии, послушать, можете поддержать нас рублём - CloudTips. Даже минимальная поддержка в виде 50 вечно деревянных пойдёт в дело. Все оказывается дорогое 😳 обложки, микрофоны, мастеринг, подписки.

Сейчас у нас несколько выпусков в обработке, поэтому, думаю, скоро напишу, где при желании нас можно послушать.

Всех, кто нас поддержал, мы обязательно упомянем в подкасте и скажем о них пару ласковых слов. Еще там по ссылке можно передать привет или сообщение, мы тоже озвучим 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥85🫡21
Давно не было чего-то из рубрики #техничка@cat_and_code

Недавно я вспомнил об очень простой штуке, которая иногда бывает просто незаменима в отладке. Все же пользуются Debug.Log(...) + красный и желтый вариант. А вот про Debug.Break() часто почему-то не в курсе.

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

Пример использования:
Тестирую систему динамического респауна персонажа. Нельзя заранее назначить безопасную точку респауна, она все время обновляется и вычисляется. Обстановка в уровне может меняться, в данном случае корабль качается на волнах. Поверхность может быть ниже или выше изначальной желательной точки. Есть алгоритм, который все это рассчитывает и вычисляет новую позицию. Вызов Debug.Break() в момент спауна позволяет визуально оценить работу алгоритма и эту самую позицию. Посмотреть куда по факту он переместил персонажа и на сколько ошибся.

#девлог@cat_and_code
🔥1031
This media is not supported in your browser
VIEW IN TELEGRAM
В преддверии выходных хочу всех порадовать ярким постом.

Релизнулся наш первый выпуск подкаста. Говорим конечно же про игры. Мы есть на всех основных платформах:
🍎 Apple Podcast
🟢 Spotify
🍑 Яндекс Музыка
🛫 Плеер в Telegram
🎶 Mp3 файл в комментариях

От всей души поддержать нас можно:
Сердечками на платформах
Поделиться впечатлениям тут или в
группе подкаста
Cloudtips — отправить чаевые в пару кликов
Boosty — поддерживать ежемесячно
Please open Telegram to view this post
VIEW IN TELEGRAM
6322
Очень круто, получилось. Я в прошлом посте поделился одним советом про дебаг, а ребята в комментариях написали еще 2 классные фишки по теме, которые я лично не использовал до этого и захотел вынести в отдельный пост. Михаил @MifanyaR и Роман @whiteHorseAstra спасибо за комментарии ❤️

Обе для Rider:
1. Ставим брейкпоинт, убираем глаку Suspend execution и ставим Evaluate and log, пишем переменную или текст лога. Теперь в юньке будет выводиться лог. Огонь, никакого перекомпила.

2. Ставим брейкпоинт и в окошке тыкаем на не привлекающую внимания надпись, Convert to Unity pausepoint. Теперь Unity будет вставать на паузу в этом месте.

#техничка@cat_and_code
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥127👍2
Когда заблокируют все мессенджеры — будем переписываться в экселе, как Келли Роуланд в клипе “Nelly - Dilemma”. Ой наверное таких стариков тут нет которые вспомнят клип 👴
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🤣63
This media is not supported in your browser
VIEW IN TELEGRAM
Обычно я соблюдаю сдержанность и не делаю посты на праздники, но тут арт художника буквально не дал мне выбора.

С праздником 🐱

Автор видео — led3.an
Please open Telegram to view this post
VIEW IN TELEGRAM
115😁332
Меня иногда немного корежит от адептов вайб-кодинга. А тут друг скинул статью на Хабре — Элитный вайбкодинг, которая демонстрирует ситуацию доведённую до фарса. Даже если вы не привыкли читать лонгриды — эта идет на одном дыхании, как байки из склепа.

Саму статью вы при желании прочтете, а я выражу наше общее с другом мнение парой цитат:

Религия Вайб-кодинг — это как член. Нормально, когда он у тебя есть. Приятно, если вы гордитесь им. Но, пожалуйста, не доставайте и не размахивайте им на людях. И ПОЖАЛУЙСТА не пытайтесь подсунуть его моим детям.

Божья искра Вайб-кодинг особенно опасен в головах набитой опилками.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1233
Я думаю на данном этапе разных запретов и ограничений никто не удивится, что я завел клон канала в Максиме? Всех желающих приглашаю страдать там вместе. Пока это будет просто клон канала, запасной аэродром так сказать. Будут все те же посты что и тут. Привычного функционала для админов каналов пока минимум. Самый полезный - вход на госуслуги и запись к врачу.

Не могу сказать, что создал там канал с удовольствием. Давайте покидаем в тред мемасики по теме, нагоним эндорфинов?
💩5511👍1😁1
Давно не было чего-то из рубрики #игры@cat_and_code И как обычно что-то специфичное.

Приложение, чтобы перед сном отключить голову и немного замедлиться. Обычно я могу включить какую-то аудиокнигу с таймером минут на 10. Интересно оказалось попробовать вместо книги что-то новое, игру-засыпалку Lumo (App Store). Ну что я могу сказать? Профессиональное искажение снова уводит от процесса в критику 😬

В процессе критики я списался с создателем приложения. Оказалось, что работу на себе тянет плюс-минус 1 человек. В лучших традициях инди — пишет код, делает модели и графику, сам пишет истории. И работает внезапно не на игровом движке, а на яблочном Reality Kit. Эта "игра" — история во плоти о том, как iOS разработчик идет в сторону геймдева. Понемногу, не переворачивая все с ног на голову, небольшими шагами и известным ему инструментарием. На своем телеграм-канале, душевно рассказывает и показывает обновления. Мне такое очень нравится. Тоже загляните.

Что за приложение? Концептуально — это атмосферное погружение в небольшие и уютные истории с 3D-сценой. Она играет роль что-то вроде иллюстрации в книге, только объемная. Озвучка профессиональная, актерами с приятными голосами. Засыпаешь действительно быстро, но у такого опыта есть и нюансы:

- Нет перемотки до той точки, где я остановился в прошлый раз, только по главам истории.

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

- Точки останова скорее отвлекают, чем помогают. Выглядит как необходимость нажимать кнопку "play" для каждой новой главы. Считай в приложении авто пауза каждые 5 минут. Если бы при клике была бы частичная смена сцены, анимацией, эффекты ну хоть что-то — было бы оправдано. В общем это приложение так пингует слушателя "Ты еще не спишь?" ⚜️

- Управление камерой, жесткое, не дает рассмотреть детали, приблизить то, что хочется приблизить. Не дает самому выбрать ракурс.

Но я верю в трудный путь разработчика, буду следить по девлогам за апдейтами 🪿
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍63