CullingGroup предлагает способ интеграции ваших собственных систем в Unity culling и LODУровень детализации (LOD) — это оптимизация, которая уменьшает количество треугольников, которые Unity должна отображать для GameObject, когда его расстояние от камеры увеличивается. Подробнее
См. в конвейере Словарь. Это можно использовать для многих целей; например:
- Имитация толпы людей при наличии только полных GameObjectsосновного объекта в сценах Unity, который может представлять персонажей, реквизит , пейзажи, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь символы, которые действительно видны прямо сейчас - Создание графического процессора системы частицКомпонент, моделирующий текучие объекты, такие как жидкости, облака и пламя, путем создания и анимации больших чисел. небольших 2D-изображений в сцене. Подробнее
См. в Словарь, управляемый Graphics.DrawProcedural, но пропускающий рендерингПроцесс вывода графики на экран (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
Посмотреть в Словарь системы частиц, которые находятся за стеной - Отслеживание точек появления, скрытых от камерыКомпонент, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь, чтобы создавать врагов так, чтобы игрок не видел, как они "всплывают" в поле зрения - Переключение персонажей с полноценной анимации и расчетов ИИ на близком расстоянии на менее качественное и более дешевое поведение на расстоянии.
- Наличие 10 000 маркеров в вашей сценеСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Просматривайте в Словарь и эффективно определяйте, когда игрок оказывается на расстоянии 1 м от любого из их
API работает, если вы предоставляете массив ограничивающих сфер. Затем вычисляется видимость этих сфер относительно конкретной камеры, а также значение «диапазона расстояний», которое можно рассматривать как число уровня детализации.
Начало работы с CullingGroup
Нет компонентов или визуальных инструментов для работы с CullingGroups; они доступны исключительно через скрипт.
CullingGroup можно создать с помощью оператора «новый»:
CullingGroup group = new CullingGroup();
To have the CullingGroup perform visibility calculations, specify the camera it should use:
group.targetCamera = Camera.main;
Создайте и заполните массив структур BoundingSphere положениями и радиусами ваших сфер и передайте его в SetBoundingSpheres вместе с количеством сфер, которые фактически находятся в массиве. Количество сфер не обязательно должно совпадать с длиной массива. Unity рекомендует создавать достаточно большой массив, чтобы вместить максимальное количество сфер, которое у вас когда-либо будет одновременно, даже если исходное количество сфер, которые у вас есть в массиве, очень мало. Использование массива большего размера позволяет добавлять или удалять сферы по мере необходимости без дорогостоящего процесса изменения размера массива во время выполнения.
BoundingSphere[] spheres = new BoundingSphere[1000];
spheres[0] = new BoundingSphere(Vector3.zero, 1f);
group.SetBoundingSpheres(spheres);
group.SetBoundingSphereCount(1);
С этого момента CullingGroup начнет вычислять видимость одной сферы в каждом кадре.
Чтобы очистить группу CullingGroup и освободить всю используемую ею память, удалите группу CullingGroup с помощью стандартного механизма .NET IDisposable:
group.Dispose();
group = null;
Получение результатов с помощью обратного вызова onStateChanged
Самый эффективный способ реагировать на изменение состояния видимости или расстояния между сферами — использовать поле обратного вызова onStateChanged. Установите это на функцию, которая принимает структуру CullingGroupEvent в качестве аргумента; затем он будет вызываться после завершения отбраковки для каждой сферы, состояние которой изменилось. Члены структуры CullingGroupEvent сообщают вам о предыдущем и новом состояниях сферы.
group.onStateChanged = StateChangedMethod;
private void StateChangedMethod(CullingGroupEvent evt)
{
if(evt.hasBecomeVisible)
Debug.LogFormat("Sphere {0} has become visible!", evt.index);
if(evt.hasBecomeInvisible)
Debug.LogFormat("Sphere {0} has become invisible!", evt.index);
}
Получение результатов через CullingGroup Query API
В дополнение к делегату onStateChanged группа CullingGroup предоставляет API для получения последних результатов видимости и расстояния любой сферы в массиве ограничивающих сфер. Чтобы проверить состояние одной сферы, используйте методы IsVisible и GetDistance:
bool sphereIsVisible = group.IsVisible(0);
int sphereDistanceBand = group.GetDistance(0);
Чтобы проверить состояние нескольких сфер, вы можете использовать метод QueryIndices. Этот метод сканирует непрерывный диапазон сфер, чтобы найти те, которые соответствуют заданному состоянию видимости или расстояния.
// Allocate an array to hold the resulting sphere indices - the size of the array determines the maximum spheres checked per call
int[] resultIndices = new int[1000];
// Also set up an int for storing the actual number of results that have been placed into the array
int numResults = 0;
// Find all spheres that are visible
numResults = group.QueryIndices(true, resultIndices, 0);
// Find all spheres that are in distance band 1
numResults = group.QueryIndices(1, resultIndices, 0);
// Find all spheres that are hidden in distance band 2, skipping the first 100
numResults = group.QueryIndices(false, 2, resultIndices, 100);
Помните, что информация, полученная с помощью API запроса, обновляется только тогда, когда камера, используемая CullingGroup, фактически выполняет отсечение.
Рекомендации по API CullingGroup
При рассмотрении того, как вы можете применить CullingGroup в своем проекте, рассмотрите следующие аспекты дизайна CullingGroup.
Использование видимости
Все объемы, для которых CullingGroup вычисляет видимость, определяются ограничивающими сферами — на практике это положение (центр сферы) и значение радиуса. Никакие другие ограничивающие фигуры не поддерживаются из соображений производительности. На практике это означает, что вы будете определять сферу, которая полностью охватывает объект, который вы хотите отсеять. Если требуется более плотное прилегание, рассмотрите возможность использования нескольких сфер для покрытия разных частей объекта и принятия решений на основе состояния видимости всех сфер.
Чтобы оценить видимость, группе CullingGroup необходимо знать, для какой камеры следует вычислять видимость. В настоящее время одна группа CullingGroup поддерживает только одну камеру. Если вам нужно оценить видимость для нескольких камер, вы должны использовать одну группу CullingGroup для каждой камеры и объединить результаты.
CullingGroup вычисляет видимость на основе отсечения усеченного конуса и статического отсечения окклюзиифункции, которая отключает визуализацию объектов, когда они не видимые в данный момент камерой, потому что они скрыты (перекрыты) другими объектами. Подробнее
См. только в Словарь. Он не будет учитывать динамические объекты как потенциальные окклюдеры.
Использование расстояния
CullingGroup может вычислять расстояние между некоторой контрольной точкой (например, положением камеры или игрока) и ближайшей точкой на каждой сфере. Это значение расстояния не предоставляется вам напрямую, а вместо этого квантуется с использованием набора пороговых значений, которые вы предоставляете, чтобы вычислить дискретный целочисленный результат «диапазона расстояний». Намерение состоит в том, чтобы вы интерпретировали эти диапазоны расстояний как «близкое расстояние», «среднее расстояние», «дальнее расстояние» и т. д.
CullingGroup обеспечивает обратные вызовы, когда объект переходит из одной полосы в другую, что дает вам возможность делать такие вещи, как изменение поведения этого объекта на что-то менее интенсивное для ЦП.
Любые сферы, находящиеся за пределами последней полосы расстояний, будут считаться невидимыми, что позволит вам легко создать реализацию отбраковки, которая полностью деактивирует объекты, находящиеся очень далеко. Если вы не хотите такого поведения, просто установите окончательное пороговое значение на бесконечное расстояние.
Для CullingGroup поддерживается только одна контрольная точка.
Производительность и дизайн
CullingGroup API не дает возможности вносить изменения в сцену, а затем немедленно запрашивать новое состояние видимости ограничивающей сферы. Из соображений производительности CullingGroup вычисляет новую информацию о видимости только во время выполнения отбраковки для камеры в целом; именно в этот момент информация доступна вам либо через обратный вызов, либо через API запросов CullingGroup. На практике это означает, что вы должны обращаться к CullingGroup асинхронно.
На массив ограничивающих сфер, который вы предоставляете группе CullingGroup, ссылается группа CullingGroup, а не копирует ее. Это означает, что вы должны сохранить ссылку на массив, который вы передаете в SetBoundingSpheres, и что вы можете изменять содержимое этого массива без повторного вызова SetBoundingSpheres. Если вам нужно несколько групп CullingGroups, которые рассчитывают видимость и расстояния для одного и того же набора сфер (например, для нескольких камер), тогда целесообразно, чтобы все группы CullingGroups использовали один и тот же экземпляр массива ограничивающих сфер.