Для проверки закидываем в сцену 3 копии префаба, запускаем и проверяем что статик батчинг работает.
Теперь нам нужно добиться такого же эффекта но только создавая объекты в рантайме. Удаляем из сцены все объекты. В справке находим статический класс StaticBatchingUtility http://unity3d.com/support/documentation/ScriptReference/StaticBatchingUtility и его единственный метод Combine. Пробуем выполнить такой код
Синтаксис:
Используется csharp
for (int i = 0; i < 3; i++) {
// Создаем новый объект
GameObject go = (GameObject)Instantiate(assetBundle.mainAsset, Vector3.right * 4 + Vector3.left * 2 * i, Quaternion.LookRotation(Vector3.up, Vector3.forward));
// Закидываем его в рут
go.transform.parent = root.transform;
// Добавляем в лист объектов
gosList.Add(go);
}
// Получаем одномерный массив GameObject-ов
gos = gosList.ToArray();
// Комбинируем в статик батчинг
StaticBatchingUtility.Combine(gos, root);
// Создаем новый объект
GameObject go = (GameObject)Instantiate(assetBundle.mainAsset, Vector3.right * 4 + Vector3.left * 2 * i, Quaternion.LookRotation(Vector3.up, Vector3.forward));
// Закидываем его в рут
go.transform.parent = root.transform;
// Добавляем в лист объектов
gosList.Add(go);
}
// Получаем одномерный массив GameObject-ов
gos = gosList.ToArray();
// Комбинируем в статик батчинг
StaticBatchingUtility.Combine(gos, root);
Т.е. мы динамически создаем 3 объекта и комбинируем их в статический батчинг. На удивление все работает! Но нам нужно пойти дальше. Теперь мы должны добавить новый объект к уже существующим.
Добавляем в скрипт OnGUI() на нем делаем кнопку при нажатии на которую выполняется код
Синтаксис:
Используется csharp
if (GUI.Button(new Rect(10, 10, 100, 30), "Instantiate")) {
// Создаем новый объект
GameObject go = (GameObject)Instantiate(assetBundle.mainAsset, Vector3.right * 4 + Vector3.left * 2 * i, Quaternion.LookRotation(Vector3.up, Vector3.forward));
// Закидываем его в рут
go.transform.parent = root.transform;
// Добавляем в лист объектов
gosList.Add(go);
// Получаем одномерный массив GameObject-ов
gos = gosList.ToArray();
// Комбинируем в статик батчинг
StaticBatchingUtility.Combine(gos, root);
}
// Создаем новый объект
GameObject go = (GameObject)Instantiate(assetBundle.mainAsset, Vector3.right * 4 + Vector3.left * 2 * i, Quaternion.LookRotation(Vector3.up, Vector3.forward));
// Закидываем его в рут
go.transform.parent = root.transform;
// Добавляем в лист объектов
gosList.Add(go);
// Получаем одномерный массив GameObject-ов
gos = gosList.ToArray();
// Комбинируем в статик батчинг
StaticBatchingUtility.Combine(gos, root);
}
А вот тут уже начинаются чудеса. Батчинг вроде работает но как то странно. Он собирает геометрию попарно (). Вот зависимость дравколов и батчинга от количества созданных динамически объектов:
Объекты 1 2 3 4 5 6 7...
Дравкол 1 1 2 2 3 3 4...
Батчинг 0 2 2 4 4 6 6...
Хотя если мы комбинируем все за один раз то получаем 1 дравкол!!!
Вопрос как это побороть и сделать так что бы геометрия добавлялась к уже имеющемуся батчингу?