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

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

@spellsingergames

Привет! Я Денис и я делаю игры на Unity. В этом блоге я делюсь своим опытом в геймдеве и не только.Навигация в закрепе: https://t.me/spellsingergames/3Написать в личку: @sinedsem

536подписчиков
Ежемесячно🇷🇺

Похожие каналы

Все →

Последние посты

SpellSinger - разработчик игр на Unity — пост в ТГ канале

Enforce full type name qualification в RiderЭта настройка в Rider может сделать вашу разработку чуть удобнее, особенно когда вы пишете код для разных платформ (WebGL/Android).Например, чтобы вызвать JS код, нужно импортировать тип System.Runtime.InteropServices:#if UNITY_WEBGLusing System.Runtime.InteropServices;#endifpublic static class WebUtils{#if UNITY_WEBGL [DllImport("__Internal")] private static extern bool SyncIdbfs();#endif}Важно не забыть также обернуть using в #if UNITY_WEBGL, иначе при переключении платформы на другую, импорт станет неиспользуемым и может быть удалён при оптимизации.Но можно сделать удобнее, и в настройках Rider, в разделе Editor > General > Auto Import, в поле Enforce full type name qualification прописать тип System.Runtime.InteropServices.DllImportAttribute. После этого ваш код будет выглядеть следующим образом:public static class WebUtils{#if UNITY_WEBGL [System.Runtime.InteropServices.DllImportAttribute("__Internal")] private static extern bool SyncIdbfs();#endif}Мне кажется, такой вариант выглядит лаконичнее и удобнее. Я также прописал себе тип GamePush.*, и обращаюсь к классам GP по полному имени:GamePush.GP_Ads.ShowSticky();

1 дек. 2025 г.705В Telegram

Сел в лужу с I2 LocalizationПочти два года назад, когда я выбирал ассет для локализации Бурить-Копать!, Unity Localization ещё была в разработке, а чуть ли не самым популярным был ассет I2 Localization. У него была куча положительных отзывов, и киллер фича - синхронизация переводов с Google Sheets.Я купил его и стал использовать в проекте. Не все в нем было идеально, в 4-5 местах пришлось доработать напильником. Пока допиливал, обратил внимание на очень плохое качество кода. Но ассет был уже куплен, и особых причин искать альтернативы не было.Некоторое время назад у меня стали подвисать операции обновления локальных данных из гугл таблиц. Я грешил на Роскомнадзор/VPN, но в конечном итоге запросы проходили.А вчера всё сломалось окончательно. Решил разобраться, в чем дело. Выяснил, что запросы к script.google.com работают в браузере и в Postman'e, но почему-то зависают и падают с таймаутом в Unity. Точную причину выяснить не получилось, и LLM не особо помог.Решил проверить, а что там с отзывами в Unity Asset Store. А там - куча единиц и жалоб на то, что ассет не поддерживается и не работает. Первая жалоба на сломанную интеграцию с Google была год назад, но у меня всё работало ещё буквально пару недель назад.То есть я буквально не могу добавить новый перевод через удобную таблицу - только через инспектор ассета.Переводить сейчас проект на другую локализацию - это огромная задача по времени. Понадобится заменить все компоненты на всех сценах и префабах, а также переделать все переводы на новый формат категорий и работы с числами.В качестве временного решения, написал простенький прокси сервер на Python, который проксирует запросы из Unity к Google. Это работает.Но задача на переезд на другой ассет уже в бэклоге. Итого:- минус $45- минус время на допиливание ассета под себя- время на переезд на другую локализацию

24 нояб. 2025 г.736В Telegram

Поймал вчера баг у себя в коде, хочу предостеречь вас. Что выведет в консоль следующий код (при условии, что другие скрипты могут менять значение Foo)? (опрос в следующем посте) public class Demo : MonoBehaviour { public bool Foo { get; set; } private…Для меня это было не очевидно, но действительно, код после yield return new WaitUntil(() => Foo); выполняется не сразу же после выхода из проверки. Перед этим могут быть выполнены другие скрипты, поэтому мы не можем быть уверены в значении Foo.

11 нояб. 2025 г.816В Telegram

Поймал вчера баг у себя в коде, хочу предостеречь вас.Что выведет в консоль следующий код (при условии, что другие скрипты могут менять значение Foo)?(опрос в следующем посте)public class Demo : MonoBehaviour{ public bool Foo { get; set; } private IEnumerator Start() { yield return new WaitUntil(() => Foo); Debug.Log(Foo); }}

10 нояб. 2025 г.833В Telegram

Исправил зависимости в Яндекс Mobile Ads SDKВ RuStore для рекламы мы используем РСЯ без медиации. При апгрейде yandex-mobileads-lite с версии 7.7.0 до версии 7.16.0 я заметил, что в пакете появились зависимости на библиотеки рекламных сетей (файл YandexMobileadsMediationDependencies.xml), необходимые для медиации, но лишние для работы только с РСЯ.Я написал об этом в поддержку РСЯ и получил ответСейчас Unity-плагин РСЯ использует базовый пакет "yandex-mobileads-lite-7.16.0.unitypackage" как для простой интеграции, так и для работы медиации. Во втором случае также нужно подключить нужные адаптеры, например, "mobileads-google-mediation-7.16.0.unitypackage". Файл с зависимостями нужен для корректной работы SDK.Пришлось немного поспоритьМне кажется, это неправильно. Если я не буду использовать медиацию, зачем мне тащить в проект com.yandex.android:mobileads-mediation и все его зависимости на все сети?Обещали разобраться. И вот вчера, спустя 20 дней, мне пришел ответСпасибо за ожидание.Мы учли ваше пожелание, данный вопрос будет решен в релизной версии SDK.+1 доброе дело в копилку ✅#репорчу_баги

30 окт. 2025 г.977В Telegram

Приходится править Game Push SDKAPI покупок в Game Push не предоставляет уникального ID/токена покупки. Списывать (консумить) покупку необходимо по ID продукта. Это плохая реализация, она не позволяет отличить две покупки одного и того же товара, что может привести к ошибкам. Также из-за этого не получится правильно дедуплицировать покупки в случае неполадок с сетью.Я завёл фиче реквест для Game Push, если вы согласны со мной, прошу поддержать лайком: https://gamepush.canny.io/feature-requests/p/consume-purchases-buy-purchase-id-token-id-idПока что пришлось самому сделать костыль в коде Game Push, а именно 1) в _gpUnity.jspre вызывать CallPaymentsPurchase, передавая result.purchase._id2) в GP_Payments.cs добавить поле _id в класс FetchPlayerPurchasesБуду использовать их _id в качестве временного решения.#веб_игры #game_push #репорчу_баги

27 окт. 2025 г.803В Telegram

Как перестроить UI при включении/выключении дочернего элемента? Внедряемся в Layout.Сегодня снова про UI. Ничто не отнимает у меня столько времени, как борьба с UI.Задача: сделать, чтобы в GridLayoutGroup ячейки были покрупнее, если элементов мало, и помельче, если их много.В Unity есть коллбек OnTransformChildrenChanged, который вызывается, когда добавляется или удаляется новый дочерний элемент. Но этот коллбек не вызывается, когда дочерний элемент становится активен или неактивен.Можно постоянно высчитывать количество активных дочерних элементовв Update, но это на самый крайний случай. Лучше не делать никакую логику в Update.Можно повесить на дочерние элементы скрипт, который будет уведомлять родителя о своем включении/выключении, но это неудобно.Предлагаю решение на основе методов SetLayoutHorizontal/SetLayoutVertical из интерфейса ILayoutController. Юнити вызывает их, когда перестраивает layout, то есть как раз, когда нам нужно.После изменения нужных нам параметров, нужно попросить Unity заново построить layout (LayoutRebuilder.ForceRebuildLayoutImmediate), желательно в том же самом кадре, чтобы не было никаких миганий. Но при этом не уйти в рекурсию.Полный код решения:using System;using System.Linq;using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;[Serializable]public class CellSizeRule{ [field: SerializeField] public int MinCount { get; private set; } [field: SerializeField] public Vector2 CellSize { get; private set; }}[RequireComponent(typeof(GridLayoutGroup))][ExecuteAlways]public class DynamicCellSizer : UIBehaviour, ILayoutController{ [SerializeField] private CellSizeRule[] rules; private GridLayoutGroup grid; private int count = -1; private GridLayoutGroup Grid { get { if (!grid) grid = GetComponent<GridLayoutGroup>(); return grid; } } protected override void OnEnable() { base.OnEnable(); ApplyRule(); } private void ApplyRuleIfN

29 сент. 2025 г.874В Telegram

Отчёт по Игропрому и GamePush Confhttps://vk.com/@drill_and_dig-igroprom2025

24 сент. 2025 г.862В Telegram

Запускал сегодня стримы с Игропрома на TwitchОстались записи:https://www.twitch.tv/videos/2571056945https://www.twitch.tv/videos/2571167520Запустить завтра ещё стрим?

20 сент. 2025 г.1 050В Telegram