Яковлев Илья | Gamedev
4.96K subscribers
269 photos
36 videos
18 files
233 links
Download Telegram
Новые лайфхаки!?

Сегодня будет длинно, но интересно...)
Ставьте 🔥, если поддерживаете длинные постики, мне нада знать стоит ли оно того:)

🧐 Кто помнит историю с Yandere Simulator?) Игры, разработчик которой настолько... своеобразно программирует, что в какой-то момент обнаружилось: практически весь его проект работает на километровых цепочках if-else, из - за чего поддерживать проект становилось совсем невозможно, разработчики бежали, проект сыпался... А вот если бы он использовал switch case...

Тооо ничего бы не поменялось, так как архитектуру проекта это не исправит, нооо возможно код был бы чуточку симпотнее)

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

Начиная с C# 7, switch-выражение умеет работать не только с конкретными значениями, но и с диапазонами. Всё, что нужно сделать - поставить между ключевым словом case и значением знак сравнения >, <, >= или <=!

private const int CriticalDamageThreshold = 10;

private void HandleDamage(int amount)
{
switch (amount)
{
// "Поймает" значения ∈ [10; ∞]
case >= CriticalDamageThreshold:
Debug.Log("Critical damage!");
break;

// "Поймает" значения ∈ (0; 10)
case > 0:
Debug.Log("Damaged!");
break;

case 0:
Debug.Log("Miss!");
break;

default:
throw new ArgumentOutOfRangeException($"{amount}");
}
}


Поддерживаются и комбинации нескольких сравнений сразу - нужно только написать их через специальные операторы or...
case > 1 or < -1:
// Делаем что-то
break;

...или and...
case >= 0 and < 10:
// Делаем что-то
break;


Но что делать, если порог CriticalDamageThreshold не константен, а подсчитывается динамически или настраивается геймдизайнером через Инспектор? В таком случае, switch не позволит вставить поле напрямую в диапазон case'а!

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

[SerializeField]
private int _criticalDamageThreshold = 10;

private void HandleDamage(int amount)
{
switch (amount)
{
case int damage when damage >= _criticalDamageThreshold:
Debug.Log("Critical damage!");
break;

// <...>
}
}


Выражения после when называются case guards и позволяют добавлять условия любой комплексности, которые должны выполняться, чтобы конкретный кейс свича "поймал" значение. Таким образом одни и те же данные можно заставить попадать в разные части switch-конструкции в зависимости от конкретных обстоятельств, что здорово прокачивает гибкость кода в конкретных моментах.

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

Кстати, это еще не все фокусы со свитчом, так что ставьте 🔥 если хотите видеть еще #лайфхаки на канале
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17310👍3🤝3😁2🐳2
Спорим вы не знали об игре, которая перевернула разработку игр?)

Мне всегда нравилось узнавать об играх сделанных на Unity, поэтому решил выделить это дело в отдельную рубрику на канале, поставьте 🔥 в поддержку:)

Сегодня мы не будем говорить о полезных фишках для Unity. Вместо этого обсудим одну игру - чёрного лебедя, о которой вы, скорее всего, ничего не знаете... а ведь если бы не она, то сегодня вся игровая индустрия выглядела бы совсем иначе - и далеко не факт, что в лучшую сторону.

🧐 Инфы получилось довольно много, так что оформление будет в виде карточек:)

Ну а подобные постики будем помечать тэгом #MadeWithUnity
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥118🐳32🌚2👍1