⚡️Наука и Факты - порно для мозга
Реклама: @Calve
Биржа: https://telega.in/c/FactTG
Менеджеры: @Spiral_Miya
Last updated 2 months, 2 weeks ago
VISA PARTNER - Крупнейший визовый центр в средней Азии ⭐️
💯 13 лет опыта визовых услуг.
Академия @visapartnerstudy
Ташкент: +998974499056
Самарканд: +998908090330
Телеграм: @Visa_Partner
Last updated 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 6 days, 18 hours ago
Сибирский джем запустили конкурс вместе с Яндекс Играми. Так как наша игра "Бурить-Копать!" ещё не готова, будем участвовать в конкурсе с нашей старой игрой, сделанной как раз на сибирском джеме, Sneaky Forest. Заодно получим первый опыт публикации, модерации и т. д.
Буду держать в курсе!
Проблема с отображением русских символов в TextMeshPro
Ещё один секрет, на этот раз от Марго. Если некоторые или все кириллические символы отображаются квадратиками, нужно в настройках шрифта указать правильный диапазон символов (Character Set, Character Sequence). Нужный диапазон для кириллицы: 0400-04FF. Не забудьте применить изменения с помощью кнопки Save (она внизу, её может не быть видно из-за скролла)
Эффект набора текста (печатной машинки)
Это эффект, когда текст появляется не сразу, а побуквенно. Может использоваться, например, в диалогах.
Один из способов сделать такой эффект, это, например, сделать окончание текста прозрачным с помощью тега <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()
, чтобы получить итоговое количество символов, которое мы хотим показать (без учёта тегов).
Зачем я использую 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. Часть 1. Внедрение зависимостей
Когда говорят о пользе DI, часто упоминают тот факт, что с помощью DI ты можешь быстро заменить одну реализацию на другую (например, переключить управление клавамышью на гейпад). Это действительно так, и это, конечно, полезная вещь, но на практике она требуется довольно редко.
Для себя я каждый день извлекаю пользу от Zenject в том, что я пишу в любом компоненте [Inject] private Foo foo;
и сразу же получаю себе зависимость Foo
;
В чем плюсы:
+ Мне не нужно париться с назначением зависимостей в инспекторе.
+ Мне не нужно делать зависимости синглтонами в классическом их понимании, со статической ссылкой на инстанс.
+ И да, если однажды мне понадобится 2 разные реализации Foo
, я сделаю Foo
интерфейсом, сделаю 2 реализации, буду их подсовывать через Zenject, а пользователи Foo
даже и не заметят разницы.
Как написать сложный алгоритм?
Если у вас не получается придумать какую-нибудь хитрую логику, мысли разбегаются и вы ее можете собрать их в кучку, попробуйте подумать не о действиях, а о структуре данных, с которыми вы работаете.
Например, вчера я пытался переписать генерацию путей в своей игре. Старая логика работала поочередно с каждым метром пути, и я не мог реализовать новые требования в старом подходе.
Как только я поменял модель данных, вместо "метров" стал думать "участками пути", код сам стал вытекать из моих пальцев.
Подумайте, возможно стоит сделать другие абстракции в коде, возможно, стоит инкапсулировать часть логики в классах с данными, возможно стоит переложить объекты из листа в словарь.
Хорошим вариантом будет начать с того, какие именно данные нужны вашему алгоритму (в моём случае следующий участок пути обязательно должен знать, где закончился предыдущий), и откуда алгоритм сможет их эффективно получить.
По моим наблюдениям, чем лучше модель данных, тем проще писать код. А значит, если код "не идёт", стоит проверить, а так ли хороша модель.
Про звуки в мобильном Яндекс Браузере
На момент написания этого поста в мобильном Яндекс Браузере не работают звуки из Unity, и для того, чтобы опубликоваться в Яндекс Играх, нужно городить костыли.
Я немного покопался, и выяснил, что не работают звуки, которые весят меньше 128кб. Почему - не знаю, но если взять длинную музыку, которая работает, и начать отрезать её по чуть-чуть, то в какой-то момент, а именно при весе меньше 128кб она перестаёт воспроизводиться.
Так как все разработчики сталкиваются с этой проблемой, в сообществе разработали решение: Unity Audio Plugin (документация, канал разработчика, чат разработчика).
Плагин решает проблему, и в целом довольно удобный, и хотя у меня есть несколько замечаний к оформлению кода и опечаткам, использовать его можно и нужно.
К сожалению, в текущей версии плагина 3.0.4 есть баг, в результате которого звуки ломаются после паузы (звуки должны ставиться на паузу, когда окно игры становится неактивно или показывается реклама).
Я думаю, что в будущем разработчик поправит эту проблему (я о ней уже сообщил и сказал как решить), но если вы хотите решить её самостоятельно, то в классе StreamingAudioProvider
замените строчки 114-117, чтобы получилось вот так:
_unitySource.clip = _clip;
_unitySource.time = _lastTime = 0;
_unitySource.Play();
_beginPlaying = true;
Если что-то не получится, пишите мне в комментарии, помогу чем смогу.
Черный фон при изменении размеров игры в браузереЕсли у вас такая же проблема, как в примере на видео, то вам нужно пойти в Player Settings > Other Settings > Rendering
и в настройке Color Space
выбрать Gamma
вместо Linear
.
Внимание! Изменение этой настройки может привести к изменению внешнего вида вашей игры. Убедитесь, что результат вас устраивает.
Пример на видео найден случайным образом в новинках Яндекс.Игр#bugs_and_fixes
Денис, добрый день. Пишем по поводу вашего сообщения в чате. Проверили и видим, что сценарий с блоком рекомендованных игр действительно воспроизводится.
Отметим, что сейчас эта панель работает в тестовом режиме. Постараемся доработать этот момент в будущем. Спасибо, что подсветили.
Продолжаем дорабатывать платформу Яндекс.Игры путём активной гражданской позиции ?
⚡️Наука и Факты - порно для мозга
Реклама: @Calve
Биржа: https://telega.in/c/FactTG
Менеджеры: @Spiral_Miya
Last updated 2 months, 2 weeks ago
VISA PARTNER - Крупнейший визовый центр в средней Азии ⭐️
💯 13 лет опыта визовых услуг.
Академия @visapartnerstudy
Ташкент: +998974499056
Самарканд: +998908090330
Телеграм: @Visa_Partner
Last updated 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 6 days, 18 hours ago