Оптимизация клеточной планеты

Подскажите как лучше сделать? У меня есть такая вот сфера-планета, у нее каждый шестиугольник отделен в отдельный объект, но таких получилось 10к+. Очевидно что все это дело норм так лагает, хотя планета планировалась еще масштабнее...

Такая же планета есть в игре Rimworld (скриншот) и там этих клеток намного больше и ничего не лагает.

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

Каждой клетке способствует экземпляр класса, возможно не обязательно MonoBehaviour, лишь бы была какая то связь, чтоб можно было выбирать клетку мышкой и получать при этом инфу о ней из ее экземпляра. Порядок нахождения клеток в массивах не важен, только нужно для каждой как то определять соседей. Сейчас это реализовано поиском 6 самых ближайших (Vector3.Distance) клеток, кроме ее самой

Делаю в блендере, юнити Планета


Ответы (1 шт):

Автор решения: Yaroslav

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

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

Каждый инстантс материала рендарятся в каждом пасе отдельно, поэтому их должно быть минимальное количество. Если шейдерная программа одна и та-же скажем у земля/трава/песок/скалы, а отличаются лишь текстурой/цветом/другие настройки то используя Material Property Block можно обойтись одним материалом который рендарится в один проход.

10k MonoBehaviour это недопустимо, они не грузят.

И того от 3 рендер пасов.

→ Ссылка