版本: Unity 6 (6000.0)
语言English
  • C#

MeshGenerationContext.AddMeshGenerationJob

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法采纳所有提交,但我们确实会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void AddMeshGenerationJob(Unity.Jobs.JobHandle jobHandle);

参数

jobHandle 要等待的 JobHandle。

描述

指示渲染器在开始处理网格之前等待提供的 JobHandle 完成。

以下代码示例演示了如何使用作业生成网格

using System;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
using UnityEngine.UIElements;

class CheckerboardElement : VisualElement { struct CheckerboardJob : IJob { [WriteOnly] public NativeSlice<Vertex> vertices; [WriteOnly] public NativeSlice<ushort> indices;

public int horizontalCount; public int verticalCount; public float divisions; public Color32 color1; public Color32 color2;

public void Execute() { Span<Color32> colors = stackalloc Color32[2]; colors[0] = color1; colors[1] = color2; int colorIndex = 0;

int vCount = 0; int iCount = 0;

float left = 0; float right = divisions; for (int i = 0; i < horizontalCount; ++i) { float top = 0; float bottom = divisions; for (int j = 0; j < verticalCount; ++j) { colorIndex = (i ^ j) & 1;

Color32 color = colors[colorIndex];

vertices[vCount + 0] = new Vertex { position = new Vector3(left, bottom), tint = color }; vertices[vCount + 1] = new Vertex { position = new Vector3(left, top), tint = color }; vertices[vCount + 2] = new Vertex { position = new Vector3(right, top), tint = color }; vertices[vCount + 3] = new Vertex { position = new Vector3(right, bottom), tint = color };

indices[iCount + 0] = (ushort)(vCount + 0); indices[iCount + 1] = (ushort)(vCount + 1); indices[iCount + 2] = (ushort)(vCount + 2); indices[iCount + 3] = (ushort)(vCount + 2); indices[iCount + 4] = (ushort)(vCount + 3); indices[iCount + 5] = (ushort)(vCount + 0);

vCount += 4; iCount += 6; top += divisions; bottom += divisions; }

left += divisions; right += divisions; } } }

int m_Divisions; Color32 m_Color1; Color32 m_Color2;

public CheckerboardElement(int divisions, Color32 color1, Color32 color2) { generateVisualContent = OnGenerateVisualContent; m_Divisions = divisions; m_Color1 = color1; m_Color2 = color2; }

void OnGenerateVisualContent(MeshGenerationContext mgc) { int horizontalCount = Mathf.FloorToInt(layout.width / m_Divisions); int verticalCount = Mathf.FloorToInt(layout.height / m_Divisions);

if (horizontalCount == 0 || verticalCount == 0) return;

var job = new CheckerboardJob { horizontalCount = horizontalCount, verticalCount = verticalCount, divisions = m_Divisions, color1 = m_Color1, color2 = m_Color2 };

int quads = horizontalCount * verticalCount;

mgc.AllocateTempMesh(quads * 4, quads * 6, out job.vertices, out job.indices); mgc.DrawMesh(job.vertices, job.indices);

JobHandle jobHandle = job.Schedule(); mgc.AddMeshGenerationJob(jobHandle); } }