Перемещение световых зондов во время выполнения
Например, если вы создаете мир, загружая множество сцен с помощью и добавляя, а затем перемещаете каждую сцену в другое положение, вам нужно перемещать Световые Пробки с их соответствующими объектами сцены.
Вы можете использовать LightProbes API для перемещения Световых Зондов во время выполнения. Вы не можете переместить Световые Зондов путем обновления компонента Transform объекта Light Probe Group, потому что Transform влияет только на запекание.
При перемещении Световых Проб с помощью API изменяется только их положение. Запеченные данные, хранящиеся в Световых Пробах, остаются прежними.
Выполните следующие действия:
- Клонирование данных Light Probes, используемых загруженной сценой, с помощью LightProbes.GetInstantiatedLightProbesForScene API. Загруженная сцена (объект
Scene) будет использовать эти клонированные данные с этого момента. - Установите новые позиции с помощью GetPositionsSelf и SetPositionsSelf APIs.
- Обновите внутреннюю структуру данных Light Probe в сцене с помощью LightProbes.Tetrahedralize или LightProbes.TetrahedralizeAsync API, так что объекты используют правильные данные света.
Если вы запекли сцену вместе с другими сценами, содержащими Световые зонды, возвращаемые данные содержат Световые зонды из всех запекшихся сцен. Подробнее об использовании Световых зондов в нескольких сценах см. Световые зонды и Scene загрузка.
Tetrahedralize APIs может занять много времени. Если вы перемещаете несколько Световых Зонд, лучше всего тетраэдрировать один раз в конце.
Вы можете использовать LightProbes.GetSharedLightProbesForScene API вместо этого, если вам нужно прочитать позиции Световых зондов в сцене, но не перемещать их.
Пример
Следующий код перемещает Light Probes в текущей сцене в новое положение каждый кадр.
Присоедините скрипт к любому объекту в сцене. При запуске проекта выберите любой объект, использующий Light Probe, чтобы вы могли видеть движение зондов. Объект Light Probe Group не перемещается.
using UnityEngine;
using UnityEngine.SceneManagement;
public class LoadSingleSceneAndMoveProbes : MonoBehaviour
{
void Update()
{
// Get a copy of the Light Probes in the current scene
LightProbes lightProbes = LightProbes.GetInstantiatedLightProbesForScene(SceneManager.GetActiveScene());
// Get the Light Probe positions
Vector3[] positions = lightProbes.GetPositionsSelf();
// Update the positions
for (int i = 0; i < positions.Length; i++)
{
positions[i].x = positions[i].x + 0.01f;
}
// Copy the new positions back to the Light Probes
lightProbes.SetPositionsSelf(positions, true);
// Tetrahedralize to update the data in the LightProbes object of the scene.
LightProbes.Tetrahedralize();
}
}