public JobHandle Generate(NativeArray <JobHandle>?jobDependencies = null) { // A NOP to make sure we have an instance before launching into threads that may need to execute on the main thread MonoBehaviourHelper.ExecuteOnMainThread(() => { }); var job = new GenerateMeshLODJob(); job.inputMesh = inputMesh.ToWorkingMesh(Allocator.TempJob); job.quality = quality; var typeNameBytes = Encoding.UTF8.GetBytes(meshSimplifierType.AssemblyQualifiedName); job.meshSimplifierTypeName = new NativeArray <byte>(typeNameBytes, Allocator.TempJob); job.outputMesh = new WorkingMesh(Allocator.Persistent, inputMesh.vertexCount, inputMesh.GetTriangleCount(), inputMesh.subMeshCount, inputMesh.blendShapeCount); JobHandle jobHandle; if (jobDependencies.HasValue) { jobHandle = job.Schedule(JobHandle.CombineDependencies(jobDependencies.Value)); } else { jobHandle = job.Schedule(); } MonoBehaviourHelper.StartCoroutine(UpdateMesh(jobHandle, job)); return(jobHandle); }
IEnumerator UpdateMesh(JobHandle jobHandle, GenerateMeshLODJob job) { while (!jobHandle.IsCompleted) { yield return(new WaitForSecondsRealtime(0.5f)); } jobHandle.Complete(); var finalMesh = outputMesh; var jobOutputMesh = job.outputMesh; jobOutputMesh.name = finalMesh.name; jobOutputMesh.ApplyToMesh(outputMesh); finalMesh.RecalculateBounds(); job.Dispose(); }