SpellSinger - разработчик игр на Unity

Description
Привет! Я Денис и я делаю игры на Unity. В этом блоге я делюсь своим опытом в геймдеве и не только.

Разрабатываю игры в прямом эфире, заглядывайте в гости: https://www.twitch.tv/spellsingergames
Уведомления о стримах: @spellsingergames
Advertising
We recommend to visit

⚡️Наука и Факты - порно для мозга

Реклама: @Calve

Биржа: https://telega.in/c/FactTG

Менеджеры: @Spiral_Miya

Last updated 1 month, 3 weeks ago

VISA PARTNER - Крупнейший визовый центр в средней Азии ⭐️

Мы специализируемся на помощи в получении виз в ?? США, ?? Канаду и ??Австралию.

? 13 лет опыта визовых услуг.

Ташкент: +998974499056
Самарканд: +998903393939
Телеграм: @Visa_Partner

Last updated 2 months, 1 week ago

PR/Commercial [email protected] Сотрудничество: @pr_avivuni
Твич https://twitch.tv/avilina_melnik
Лайк https://l.likee.video/p/1pJphE
Вк группа https://vk.com/avi.vuni

Last updated 2 months, 1 week ago

11 months, 2 weeks ago

Сибирский джем запустили конкурс вместе с Яндекс Играми. Так как наша игра "Бурить-Копать!" ещё не готова, будем участвовать в конкурсе с нашей старой игрой, сделанной как раз на сибирском джеме, Sneaky Forest. Заодно получим первый опыт публикации, модерации и т. д.

Буду держать в курсе!

11 months, 2 weeks ago

Проблема с отображением русских символов в TextMeshPro

Ещё один секрет, на этот раз от Марго. Если некоторые или все кириллические символы отображаются квадратиками, нужно в настройках шрифта указать правильный диапазон символов (Character Set, Character Sequence). Нужный диапазон для кириллицы: 0400-04FF. Не забудьте применить изменения с помощью кнопки Save (она внизу, её может не быть видно из-за скролла)

#ui #TextMeshPro

11 months, 2 weeks ago

Эффект набора текста (печатной машинки)

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

Один из способов сделать такой эффект, это, например, сделать окончание текста прозрачным с помощью тега <color=\#FFFFFF00>. Этот способ описывается, например, тут. Мне он не очень понравился, потому что имеет ограничения, например, он не применим, если в тексте уже есть разметка (особенно другие цвета).

Мне посоветовали (зрители моего стрима) посмотреть на вот этот ассет, из которого я взял самую суть и делюсь ей с вами:

private IEnumerator DoType() { var totalVisibleCharacters = tmpText.GetParsedText().Length; for (var i = 0; i <= totalVisibleCharacters; i++) { tmpText.maxVisibleCharacters = i; yield return new WaitForSeconds(delay); } }

То есть, мы используем свойство TMP maxVisibleCharacters, которое позволяет ограничить количество отображаемых символов, и метод GetParsedText(), чтобы получить итоговое количество символов, которое мы хотим показать (без учёта тегов).

#ui #effects #TextMeshPro

11 months, 4 weeks ago

Зачем я использую Zenject. Часть 2. События

В Zenject событие называeтся Signal, очевидно, это сделано для того, чтобы не было конфликта с зарезервированным в C# словом event.

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

Приведу пример, как я использую и чем мне помогают события при разработке игры на Unity.

В моей игре, уровень начинается с того, что игрок нажимает кнопку влево или вправо. За ввод данных (player input) отвечает один монобех, PlayerController, который знает, когда уровень начался или ещё нет. Он и "бросает" событие PlayLevel.

Есть ряд действий, которые нужно выполнить в тот момент, когда начинается уровень:
- Камера переходит из начального положения в игровое положение (меняется offset)
- Изменяется фоновая музыка
- С экрана убирается подсказка
- Запускается процесс потребления топлива

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

В пользу Zenject'а по сравнению с событиями, реализованными с помощью Scriptable Objects, замечу, что с Zenject
1) мне не нужно присваивать значения в инспекторе, всё происходит в коде
2) я могу легко найти все места, где используется какое-то событие в IDE, поиском по местам использования класса PlayLevel

#zenject

12 months ago

Зачем я использую Zenject. Часть 1. Внедрение зависимостей

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

Для себя я каждый день извлекаю пользу от Zenject в том, что я пишу в любом компоненте [Inject] private Foo foo; и сразу же получаю себе зависимость Foo;

В чем плюсы:
+ Мне не нужно париться с назначением зависимостей в инспекторе.
+ Мне не нужно делать зависимости синглтонами в классическом их понимании, со статической ссылкой на инстанс.
+ И да, если однажды мне понадобится 2 разные реализации Foo, я сделаю Foo интерфейсом, сделаю 2 реализации, буду их подсовывать через Zenject, а пользователи Foo даже и не заметят разницы.

#zenject

12 months ago

Как написать сложный алгоритм?

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

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

Как только я поменял модель данных, вместо "метров" стал думать "участками пути", код сам стал вытекать из моих пальцев.

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

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

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

#философия

12 months ago

Про звуки в мобильном Яндекс Браузере

На момент написания этого поста в мобильном Яндекс Браузере не работают звуки из Unity, и для того, чтобы опубликоваться в Яндекс Играх, нужно городить костыли.

Я немного покопался, и выяснил, что не работают звуки, которые весят меньше 128кб. Почему - не знаю, но если взять длинную музыку, которая работает, и начать отрезать её по чуть-чуть, то в какой-то момент, а именно при весе меньше 128кб она перестаёт воспроизводиться.

Так как все разработчики сталкиваются с этой проблемой, в сообществе разработали решение: Unity Audio Plugin (документация, канал разработчика, чат разработчика).

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

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

Я думаю, что в будущем разработчик поправит эту проблему (я о ней уже сообщил и сказал как решить), но если вы хотите решить её самостоятельно, то в классе StreamingAudioProvider замените строчки 114-117, чтобы получилось вот так:

_unitySource.clip = _clip; _unitySource.time = _lastTime = 0; _unitySource.Play(); _beginPlaying = true;

Если что-то не получится, пишите мне в комментарии, помогу чем смогу.

#яндексигры #репорчу_баги

1 year ago

Черный фон при изменении размеров игры в браузереЕсли у вас такая же проблема, как в примере на видео, то вам нужно пойти в Player Settings > Other Settings > Rendering и в настройке Color Space выбрать Gamma вместо Linear.

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

Пример на видео найден случайным образом в новинках Яндекс.Игр#bugs_and_fixes

1 year ago

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

Отметим, что сейчас эта панель работает в тестовом режиме. Постараемся доработать этот момент в будущем. Спасибо, что подсветили.

1 year ago

Продолжаем дорабатывать платформу Яндекс.Игры путём активной гражданской позиции ?

#репорчу_баги

We recommend to visit

⚡️Наука и Факты - порно для мозга

Реклама: @Calve

Биржа: https://telega.in/c/FactTG

Менеджеры: @Spiral_Miya

Last updated 1 month, 3 weeks ago

VISA PARTNER - Крупнейший визовый центр в средней Азии ⭐️

Мы специализируемся на помощи в получении виз в ?? США, ?? Канаду и ??Австралию.

? 13 лет опыта визовых услуг.

Ташкент: +998974499056
Самарканд: +998903393939
Телеграм: @Visa_Partner

Last updated 2 months, 1 week ago

PR/Commercial [email protected] Сотрудничество: @pr_avivuni
Твич https://twitch.tv/avilina_melnik
Лайк https://l.likee.video/p/1pJphE
Вк группа https://vk.com/avi.vuni

Last updated 2 months, 1 week ago