Яковлев Илья | Gamedev
4.96K subscribers
270 photos
36 videos
18 files
237 links
Download Telegram
Яковлев Илья | Gamedev pinned «Навигация по каналу: 🖥 Основные ресурсы: - Бот (тут можно забрать подробный roadmap с 0 до junior) - Ютуб канал - Обучение Unity adventure 👨‍💻 Рубрики: #лайфхаки - небольшие особенности Unity и C#, которые могут помочь в разработке #студия - рассказы/новости/кейсы…»
Решил немного обновить навигацию по каналу (сообщение в закрепе) :)

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

🙃 А вообще как у вас дела? Как двигаются проекты/обучение?)
Please open Telegram to view this post
VIEW IN TELEGRAM
24👍7🐳3
В прошлом посте про #лайфхаки в C# мы разобрали, как можно удобно работать с диапазонами и комплексными условиями в switch-case конструкции. Вы поставили много 🔥, и это не осталось незамеченным! Так что сегодня продолжаем разбираться с интересными свойствами свича! 😎

Итак, у нас есть Юнити-приложение с внутриигровыми покупками. Мы выпускаем наш проект сразу на трёх платформах: в Play Market, в AppStore и в Стиме для Windows и macOS. У каждой из площадок - своя система обработки покупок, поэтому мы создали общий интерфейс IPurchaseService, к которому обращаемся в коде, и написали три отдельные реализации под каждый из магазинов приложений. Теперь нам остаётся только проинициализировать правильный сервис при запуске игры.

Ну и, в целом, switch-конструкция выглядит тут неплохим решением:
RuntimePlatform currentPlatform = Application.platform;
IPurchaseService purchaseService;

switch (currentPlatform)
{
case RuntimePlatform.WindowsPlayer:
case RuntimePlatform.OSXPlayer:
purchaseService = new SteamPurchaseService();
break;

case RuntimePlatform.IPhonePlayer:
purchaseService = new AppStorePurchaseService();
break;

case RuntimePlatform.Android:
purchaseService = new PlayMarketPurchaseService();
break;

default:
throw new Exception($"Unsupported platform: {currentPlatform}")
}


...и, вроде, всё работает, но создаётся явное ощущение, что для такого простого действия получилось многовато словесного шума.

Нет ли варианта лаконичнее?

✔️ Конечно же есть! С выходом C# 8 в языке была представлена новая фича - switch expressions. Она даёт знакомой нам конструкции непривычный краткий синтаксис следующего формата:
%имя_значения% switch
{
%кейс1% => %возвращаемое_значение%,
%кейс2% => %возвращаемое_значение%,
// <...>
_ => %дефолтное_возвращаемое_значение%
};


То, что свич-выражение вернёт как результат своей работы, можно будет сохранить в переменную или передать куда-то ещё. Самое то для нашего случая!

После рефакторинга получается такое:
// Статический импорт значений enum для краткости.
// Трюк выполнен профессионалами. Не повторяйте в жизни!
using static UnityEngine.RuntimePlatform;

// <...>

RuntimePlatform currentPlatform = Application.platform;

IPurchaseService purchaseService = currentPlatform switch
{
WindowsPlayer => new SteamPurchaseService(),
OSXPlayer => new SteamPurchaseService(),
IPhonePlayer => new AppStorePurchaseService(),
Android => new PlayMarketPurchaseService(),
_ => throw new Exception($"Unsupported platform: {currentPlatform}")
};


...и, вроде, уже все выглядит на порядок лучше, но как-то нехорошо смотрятся WindowsPlayer и OSXPlayer, которые пришлось прописать как два разных кейса, хоть они возвращают одно и то же. Но и это можно исправить при помощи контекстного ключевого слова or, о котором мы уже говорили в прошлый раз!

WindowsPlayer or OSXPlayer => new SteamPurchaseService(),


Диапазоны и другие ключевые слова, вроде and, when и отрицания not, тоже поддерживаются, так что в гибкости работы switch expressions ничем не уступают обычным свичам:
int healthPerCents = GetHealthPerCents();

CharAnimation animation = healthPerCents switch
{
100 => CharAnimation.Normal,
>= 25 and not > 100 => CharAnimation.Hurt,
> 0 and not > 100 => CharAnimation.CriticalState,
0 when _timeForReviveSeconds > 0 => CharAnimation.Dying,
0 => CharAnimation.Dead,
_ => throw new Exception($"{healthPerCents}")
};


Такая вот сегодня вышла switch-фишечка. Но и это ещё не всё, что умеет данная конструкция! В запасах лежит ещё одна маленькая интересность, которая иногда очень пригождается в проектах. Интересно о ней узнать? Ставь 🔥, и все будет в заключительном посте на эту тему!))
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1134🐳4👾2
Всем привет, снова с постом - вакансией от знакомых:)

————
Ищем backend разработчика на игровой проект на фулл тайм. Уровень разработчика от Middle+ до Senior.

Основное:

- Владение бэкендом: от проектирования и разработки до развертывания и поддержки
- Владение Docker, Docker Compose, умение поднять с 0 сервер
- Бэкенд на .net
- Фрондент на Unity
- Понимание DevOps
- Опыт написания realtime мультиплеерных механик

Работа удаленная, постоянное трудоустройство

Проект на ПК и Мобильные платформы.
За ориентир по сложности проектов можно брать Delta Force.
————

За подробностями писать сюда -> @K0nDeR

p.s. указывайте, пожалуйста, проекты и релевантный опыт в резюме
12🐳3
И снова всем #ПриветИзПрошлого!)

А вот вам ещё кусочек необычного кода, который реально работал в Юньке!

➡️ В прошлом посте про старый Юнити мы обсуждали, что раньше можно было писать скрипты аж на трёх языках. И если один из них - Boo, - оказался почти никому не нужен и вскоре забыт, то второй, - UnityScript, - зашёл немалому числу людей, и долгое время был настоящим конкурентом C#.

⚙️ И это не удивительно. Boo интегрировали в Юнити чисто "чтобы был". Создателя языка просто наняли в штат компании, и он как-то там поддерживал своё детище на фоне. А вот UnityScript разрабатывали самостоятельно, эксклюзивно для движка, поэтому этот язык умел некоторые штуки, о которых даже современный C# может только мечтать.

💡 Например, в скриптах было необязательно писать класс - просто лепи код, как есть, а движок сам поймёт, что нужно отнаследоваться от монобеха. А ещё все сущности, написанные на этом языке, сразу умели отображаться в Инспекторе, потому что аттрибут [System.Serializable] применялся к ним автоматически.

ℹ️ Само название UnityScript намекает, что его основные идеи нагло спёрли подсмотрели у JavaScript. Даже файлам с кодом оставили расширение .js, из-за чего некоторые начинающие разработчики игр потом искренне верили, что именно так и выглядит ДжаваСкрипт - с классами и статической типизацией 😂

📉 К сожалению, хоть этот язык и шёл гораздо лучше Boo, в итоге они разделили одну судьбу. Со временем разработчики всё больше склонялись в сторону C#, считая, что альтернативы - ерунда и детский лепет. В итоге Unity Technologies объявили, что и Boo, и UnityScript будут полностью удалены из движка.

📊 И пусть на тот момент меньше 3% всех проектов использовали UnityScript как основной язык, всё равно в каждой пятой игре, сделанной на Unity, был хотя бы один .js-файл. Поэтому, в отличие от Boo, нашего героя не забыли полностью. Более того, именно из-за него по сей день некоторые новички верят, что в Unity можно писать код на ДжаваСкрипте... или вообще на Java))

А ещё ходят слухи, что где-то в тёмных подвалах разработчики до сих пор поддерживают старые игры, написанные на UnityScript...

А вы встречали UnityScript в проектах? 🧐 Пишите в комментариях и ставьте 🔥 , если хотите узнать больше о старой Юньке!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2312🐳7