Я уже писал про PackTextures , но эта штука ломается, если невозможно запаковать текстуры, т.к. их размер увеличивается максимальный размер атласа. Для этого можно использовать GenerateAtlas, т.к. этот метод ничего не делает с текстурами, а только работает с ректами и возвращает true, если все объекты поместятся в атлас. То есть можно сначала вызвать его, а потом использовать PackTextures, либо запаковать самостоятельно, с помощью SetPixels.

Читать далее  

Как-то не заметно произошло появление этого класса в юнити, но появился он аж в 2019.2.

Это такая удобная штука, которая позволяет получать уже нужные типы без необходимости искать их во всех сборках.

https://docs.unity3d.com/ScriptReference/TypeCache.html

Читать далее  

В юнити есть замечательная штука, которую мало кто получает. На самом деле даёт возможность считать примитивами. В качестве примера я такое часто использую для того, чтобы знать, какие объекты нужно просчитывать, а какие — нет. Наверное, это апи можно считать уже в обстановке, т.к. Приходите всякие брг, которые умеют выбраковывать, плюс это апи не умеет всплески. Но на самом деле я все равно его использую, т.к. даже на уровне представления он дает прирост, если самому отключать аниматоры/рендеры и прочие штуки.

https://docs.unity3d.com/Manual/CullingGroupAPI.html

Читать далее  

Мы храним SystemInfo.deviceUniqueIdentifier, который вовсе не device id, а advertisement id, т.е. раньше он был айдишником девайса, но потом от их использования отказались в пользу различных авторизаций.

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

Когда я разбирал исходники ios, я находил там несколько вариантов этой строки, там был и айди девайса, и мак адрес и всякие другие попытки получить уникальный айди (всего было штук 5, если мне не изменяет память).

Раньше этот айдишник был вполне стабилен, т.к. являлся заводским уникальным айдишником. Сейчас нам дают рекламный айди, который может измениться в любой момент. Самый простой способ - сохранить его в PlayerPrefs, чтобы даже при его изменении со стороны ОС - ничего не менялось для игрока. Естественно, мы предупреждаем, что лучше бы подключить какую-нибудь сеть типа фейсбука, чтобы не потерять прогресс, но это как прочитать readme.

Но люди продолжали жаловаться, что аккаунты теряются, в основном на ios, т.к. именно там рекламные айдишники меняются и меняются часто. Т.е. люди просто удаляли игру и ставили ее заново, прогресс естественно терялся. Чтобы решить эту проблему, мы начали сохранять ключ в Keychain и проблема ушла.

Читать далее  

Я уже делал пост про FixUpdate (https://t.me/unsafecsharp/103), но не написал про разницу между fixDeltaTime и deltaTime.

В методе Update deltaTime будет измеряться время, прошедшее с прошлого кадра, при этом фиксированноеDeltaTime будет равно фиксированной величине.

А вот в фиксированном обновлении фиксированногоDeltaTime сохраняется, а вот deltaTime будет соответствовать фиксированномуDeltaTime. Другими словами, можно использовать deltaTime внутри фиксированного обновления.

Читать далее  

Мы часто используем этот метод для динамического создания атласа, когда, например, загружаем аватарки игроков, о которых мы заранее не знаем. Или мы формируем атлас для боя, когда игроки могут выбрать какие-нибудь скины юнитов, а нам все еще нужен 1 ничья ;)

Читать далее  

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

Есть способ комбинировать меши и без этого: mesh.CombineMeshes.

Но пандемия переходит к уже структурам, в которых базируются матрицы и мешки.

Мы часто используем такое для 3D, когда создаём одну мешку и вместо 1к объектов отображаем всего один. Естественно, нужно понимать, что батчить нужно по-материально, т.е. какой-то код с этой логикой нужно будет все же написать.

Читать далее