包含此页的版本:
不含此页的版本:
为了表示平面,Unity 包括 Plane 和四边形一种类似于平面但其边只有一个单位长的图元对象,它仅使用 4 个顶点,并且表面定向在局部坐标空间的 XY 平面上。更多信息
请参阅术语表 原始游戏对象,您可以在场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
请参阅术语表.但是,了解如何使用脚本构造四边形很有用meshUnity 的主要图形原语。网格体构成了 3D 世界的很大一部分。Unity 支持三角或四边形多边形网格。Nurbs、Nurms、Subdiv 曲面必须转换为多边形。更多信息
请参阅术语表你自己。这对于程序化网格体生成至关重要。
注意:Unity 以三角形而不是四边形处理和显示几何体。这意味着 Quad 基元由两个三角形组成。
您需要做的第一件事是设置形状使用的顶点数组。
此示例假定四边形位于 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;
此示例按以下顺序提供顶点:
由于 Unity 检索网格数据属性的方式,在自己的数组中设置数据,然后将数组分配给属性(例如,将Mesh.vertices或Mesh.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;
以下脚本将上述所有内容组合在一起,在场景中创建一个四边形。要使用它:
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 函数中添加代码,使网格体更改每一帧。请注意,这会大大增加网格体生成的资源强度。