Партиклы можно использовать в качестве рендера своих спрайтов.

Для этого нужно вызвать var count = particleSystem.GetParticles(particlesArr); изменить массив и вызвать particleSystem.SetParticles(particlesArr, count).

Таким образом можно контролировать тысячи частиц. На практике мы с таким столкнулись, когда нам нужно было отрисовать 4 тысячи юнитов на экране телефона, при этом каждый юнит имел по 4 спрайта, т.е. 16к спрайтов на одном экране старенького андроида в 2015м году. 

Тогда юнити еще толком не умела нормально контролировать партиклы и пришлось писать свои партиклы на плюсах, что повлекло за собой боль с поддержкой этого кода под все платформы (а это были PS4/XBOXONE/Switch/iOS/Android/PC(x86/x64). И да, в итоге юнити доделали партиклы и мы с радостью избавились от этого кода, но осадочек то остался 😉

Read More  

Если у вас в проекте есть много skinnedmesh анимаций (например, у вас по лесу бегает много животных), то их анимации можно запечь в текстуру, откуда читать шейдером. Такие анимации будут работать довольно с сильной погрешностью, но для объектов окружения этого может быть вполне достаточно. Такое решение намного производительнее, т.к. работает с одной текстурой и укладывается в один DrawCall.

Read More  

Метод Array.Resize не проверяет размер массива в сторону уменьшения. То есть всегда будет выделен массив необходимого размера на выходе.

Read More  

При сериализации структур в бинарь можно использовать подход *(T*)ptr = value, где ptr - указатель на массив byte, а value - данные, которые мы хотим туда записать. Если вы используете managed массив, то не забудьте использовать fixed.

Read More  

Можно вызывать internal методы из других assembly, но для этого нужно разрешить другим assembly видеть эти методы. Для этого нужно написать аттрибут InternalsVisibleTo с указанием имени assembly, которая будет видеть internal-методы:

[assembly: InternalsVisibleTo("Friend.Assembly.Name")]
Read More  

This is a generic blog article you can use for adding blog content / subjects on your website. You can edit all of this text and replace it with anything you have to say on your blog.

В C# строки хранятся в памяти в единственном экземпляре. Называется интернирование.

Код 

if (str1 == “something” || str2 == “something”)

не будет создавать 2 строки, а будет использовать ссылку на один и тот же объект (да, строка - это Reference Type).

Read More  

This is a generic blog article you can use for adding blog content / subjects on your website. You can edit all of this text and replace it with anything you have to say on your blog.

Чтобы атомарно изменить значение переменной можно использовать lock, но это один из самых долгих способов. Гораздо быстрее использовать Interlocked методы.

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

Read More  

This is a generic blog article you can use for adding blog content / subjects on your website. You can edit all of this text and replace it with anything you have to say on your blog.

Для сравнения Unity Object с null можно использовать конструкцию if (obj is null) вместо if (obj == null).

А еще если obj - это Unity Object, то оператор == перегружен и проверяет не только фактический null на стороне C#, но и объект на стороне C++.

Тот же эффект достигается при использовании ReferenceEquals.

Read More  

This is a generic blog article you can use for adding blog content / subjects on your website. You can edit all of this text and replace it with anything you have to say on your blog.

Вы можете написать метод GetEnumerator в любой структуре или классе, это позволит использовать конструкцию foreach.

Но есть несколько моментов, которые стоит понимать:

  1. Результат метода должен вернуть структуру или объект, в котором есть метод MoveNext и свойство Current;
  2. При использовании интерфейса IEnumerable (например, в List<>) при любом использовании foreach или GetEnumerator значение будет запаковано (boxing) и избежать этого уже никак не выйдет.
Read More