版本:Unity 6 (6000.0)
语言:English
通过 Mesh API 访问网格
使用细节层次 (LOD) 简化远处的网格

通过脚本创建四边形网格

为了表示平面,Unity 包含平面和四边形一个类似于平面的基本对象,但其边缘仅为一个单位长,它仅使用 4 个顶点,并且表面位于局部坐标空间的 XY 平面中。 更多信息
参见 术语表
基本游戏对象,您可以在您的场景场景包含游戏环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您放置您的环境、障碍物和装饰,本质上是分块设计和构建您的游戏。 更多信息
参见 术语表
中实例化它们。但是,了解如何使用脚本构建四边形网格Unity 的主要图形基元。网格构成 3D 世界的很大一部分。Unity 支持三角形或四边形多边形网格。Nurbs、Nurms、细分曲面必须转换为多边形。 更多信息
参见 术语表
非常有用。这对于程序化网格生成至关重要。

注意:Unity 以三角形而非四边形的方式处理和显示几何图形。这意味着四边形基本对象由两个三角形组成。

顶点数组

您需要做的第一件事是设置形状使用的顶点数组。

此示例假设四边形位于 x 轴和 y 轴上,并且您的脚本包含变量 width 和 height。

Vector3[] vertices = new Vector3[4]
{
    new Vector3(0, 0, 0),
    new Vector3(width, 0, 0),
    new Vector3(0, height, 0),
    new Vector3(width, height, 0)
};
mesh.vertices = vertices;

此示例按以下顺序提供顶点

  1. 左下
  2. 右下
  3. 左上
  4. 右上

由于 Unity 获取 Mesh 数据属性的方式,在您自己的数组中设置数据然后将数组分配给属性(例如,分配给 Mesh.verticesMesh.normals)比通过单个元素访问属性数组效率更高。

三角形

接下来,您需要设置三角形。一个四边形由两个三角形组成,每个三角形由您之前创建的顶点数组中的三个点组成。要指定这些点,您将每个三角形定义为顶点数组的三个索引。例如,此四边形的左下三角形使用索引 0、2 和 1,这对应于顶点数组中的坐标 (0, 0, 0)、(0, height, 0) 和 (width, 0, 0)。顺序很重要,因为您必须按顺时针顺序排列角点。右上三角形使用索引 2、3 和 1。

int[] tris = new int[6]
{
    // lower left triangle
    0, 2, 1,
    // upper right triangle
    2, 3, 1
};
mesh.triangles = tris;

法线

具有顶点和三角形的网格在场景中可见,但 Unity 无法正确对其进行着色,因为它还没有法线。此示例的法线很简单,因为它们都相同。每个法线都指向四边形局部空间中的负 z 轴方向。添加法线后,Unity 会正确地对四边形进行着色,但您需要在场景中添加灯光才能看到效果。

Vector3[] normals = new Vector3[4]
{
    -Vector3.forward,
    -Vector3.forward,
    -Vector3.forward,
    -Vector3.forward
};
mesh.normals = normals;

如果您不想自己定义法线,可以使用 Mesh.RecalculateNormals()

纹理坐标

最后,为了正确地在网格的材质上显示纹理,请向网格添加纹理坐标。纹理坐标介于 0 和 1 之间。网格中的每个顶点都有一个纹理坐标,用于指定在材质的纹理的哪个位置进行采样。要在四边形上显示整个纹理,每个顶点的纹理坐标值都应为 0 或 1,以便四边形的每个角对应于纹理的一个角。

Vector2[] uv = new Vector2[4]
{
      new Vector2(0, 0),
      new Vector2(1, 0),
      new Vector2(0, 1),
      new Vector2(1, 1)
};
mesh.uv = uv;

最终脚本

以下脚本将上述所有内容组合在一起,以在您的场景中创建四边形。要使用它

  1. 创建一个新的 C# 脚本(菜单:资源 > 创建 > MonoBehaviour 脚本)并将其命名为 QuadCreator。
  2. 打开 QuadCreator 脚本,将示例代码复制到其中,然后保存脚本。
  3. 返回编辑器,在场景中创建一个新的游戏对象(菜单:游戏对象 > 创建空对象)。
  4. 在检查器中,选择添加组件 > 脚本 > Quad Creator
  5. 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路径点等。游戏对象的特性由附加到它的组件定义。 更多信息
    参见 术语表
    放置在场景中的任意位置。
  6. 进入播放模式。如果您在场景或游戏视图中看不到四边形,请确保您是从正确的侧面查看它;Unity 不会渲染此网格的反面。
using UnityEngine;

public class QuadCreator : MonoBehaviour
{
    public float width = 1;
    public float height = 1;

    public void Start()
    {
        MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
        meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));

        MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();

        Mesh mesh = new Mesh();

        Vector3[] vertices = new Vector3[4]
        {
            new Vector3(0, 0, 0),
            new Vector3(width, 0, 0),
            new Vector3(0, height, 0),
            new Vector3(width, height, 0)
        };
        mesh.vertices = vertices;

        int[] tris = new int[6]
        {
            // lower left triangle
            0, 2, 1,
            // upper right triangle
            2, 3, 1
        };
        mesh.triangles = tris;

        Vector3[] normals = new Vector3[4]
        {
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward,
            -Vector3.forward
        };
        mesh.normals = normals;

        Vector2[] uv = new Vector2[4]
        {
            new Vector2(0, 0),
            new Vector2(1, 0),
            new Vector2(0, 1),
            new Vector2(1, 1)
        };
        mesh.uv = uv;

        meshFilter.mesh = mesh;
    }
}

注意:此示例代码位于 Start 函数中,这意味着它在您进入播放模式时执行一次,并且网格在整个应用程序中不会发生变化。但是,您可以在 Update 函数中添加代码以使网格在每一帧都发生变化。请注意,这会大大增加网格生成的资源强度。

通过 Mesh API 访问网格
使用细节层次 (LOD) 简化远处的网格