Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Physics.BakeMesh

Объявление

public static void BakeMesh(int meshID, bool convex);

Параметры

meshID Идентификатор экземпляра Mesh, из которого необходимо испечь данные о столкновениях.
convex Флаг, указывающий, запекать выпуклую геометрию или нет.

Описание

Подготавливает сетку к использованию с MeshCollider.

Эта функция запускает запекание сетки и сохраняет результат в самой сетке. Когда создается экземпляр MeshCollider, ссылающийся на эту сетку, он повторно использует запеченные данные вместо повторного запекания сетки. Это полезно, когда вы хотите перенести дорогостоящий процесс запекания из времени загрузки сцены или времени создания экземпляра в другой момент времени. BakeMesh является потокобезопасным и выполняет вычисления в потоке, из которого он был вызван, однако недопустимо вызывать BakeMesh для одного и того же меша из нескольких потоков одновременно, поскольку это приводит к неопределенному поведению. Вы можете использовать BakeMesh с системой заданий C#. Вот пример:

using UnityEngine; public class MinimalTest : MonoBehaviour { public Mesh mesh; private MeshCollider collider; private void OnEnable() { // Запекаем эту сетку для последующего использования. Physics.BakeMesh(mesh.GetInstanceID(), false); } public void FixedUpdate() { // Если коллайдер еще не создан - создайте его сейчас. if (collider == null) { // No mesh baking will happen here because the mesh was pre-baked, making instantiation faster. collider = new GameObject().AddComponent<MeshCollider>(); collider.sharedMesh = mesh; } } }

BakeMesh является потокобезопасным и выполняет вычисления в потоке, из которого был вызван. Вы можете использовать BakeMesh с системой заданий C#. В этом примере показано, как запекать сетки в нескольких потоках, чтобы создание экземпляра MeshCollider занимало меньше времени в основном потоке.

using Unity.Collections; using Unity.Jobs; using UnityEngine; public struct BakeJob : IJobParallelFor { private NativeArray meshIds; public BakeJob(NativeArray meshIds) { this.meshIds = meshIds; } public void Execute(int index) { Physics.BakeMesh(meshIds[index], false); } } public class JobifiedBaking : MonoBehaviour { public Mesh[] meshes; public int meshesPerJob = 10; // Выпекать все меши из основного потока, а затем создавать экземпляры в основном потоке. private void OnEnable() { // Вы не можете получить доступ к GameObjects и Components из других потоков напрямую. // Таким образом, вам нужно создать собственный массив идентификаторов экземпляров, которые BakeMesh примет. NativeArray meshIds = new NativeArray(meshes.Length, Allocator.TempJob); for (int i = 0; i < meshes.Length; ++i) { meshIds[i] = meshes[i].GetInstanceID(); } // Это распределяет дорогостоящую операцию по всем ядрам. var job = new BakeJob(meshIds); job.Schedule(meshIds.Length, meshesPerJob).Complete(); meshIds.Dispose(); // Теперь создайте коллайдеры в основном потоке. for (int i = 0; i < meshes.Length; ++i) { new GameObject().AddComponent<MeshCollider>().sharedMesh = meshes[i]; } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3