以下是用Mesh绘制墙体,代码复制后挂载在一个空对象上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//一份Mesh绘制一面墙
[RequireComponent(typeof(MeshFilter),typeof(MeshRenderer))]
public class CreateWall : MonoBehaviour
{
public int width = 1; // 墙面的宽度(正方体的数量)
public int height = 1; // 墙面的高度(正方体的数量)
public float cubeSize = 1.0f; // 正方体的大小
void Start()
{
// 创建共享的 Mesh
Mesh sharedMesh = new Mesh();
// 生成顶点、三角形索引和 UV 坐标
Vector3[] vertices = GenerateVertices();
int[] triangles = GenerateTriangles();
// 将顶点、三角形索引和 UV 坐标设置到共享的 Mesh
sharedMesh.vertices = vertices;
sharedMesh.triangles = triangles;
GetComponent<MeshFilter>().sharedMesh = sharedMesh;
GetComponent<MeshRenderer>().material = new Material(Shader.Find("Standard"));
// 设置墙面的位置和缩放
transform.position = transform.position;
transform.localScale = new Vector3(cubeSize, cubeSize, cubeSize);
}
Vector3[] GenerateVertices()
{
int numCubes = width * height;
Vector3[] vertices = new Vector3[numCubes * 8];
int index = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
float offsetX = x * cubeSize;
float offsetY = y * cubeSize;
// 生成一个正方体的顶点
Vector3[] cubeVertices = new Vector3[]
{
new Vector3(0, 0, 0) + new Vector3(offsetX, offsetY, 0),
new Vector3(1, 0, 0) + new Vector3(offsetX, offsetY, 0),
new Vector3(1, 1, 0) + new Vector3(offsetX, offsetY, 0),
new Vector3(0, 1, 0) + new Vector3(offsetX, offsetY, 0),
new Vector3(0, 0, 1) + new Vector3(offsetX, offsetY, 0),
new Vector3(1, 0, 1) + new Vector3(offsetX, offsetY, 0),
new Vector3(1, 1, 1) + new Vector3(offsetX, offsetY, 0),
new Vector3(0, 1, 1) + new Vector3(offsetX, offsetY, 0),
};
// 将正方体的顶点添加到共享的顶点数组中
cubeVertices.CopyTo(vertices, index);
index += 8;
}
}
return vertices;
}
int[] GenerateTriangles()
{
int numCubes = width * height;
int[] triangles = new int[numCubes * 36];
int index = 0;
for (int i = 0; i < numCubes; i++)
{
int baseIndex = i * 8;
// 生成一个正方体的三角形索引
int[] cubeTriangles = new int[]
{
0,2,1,0,3,2,
1,6,5,1,2,6,
5,7,4,5,6,7,
4,3,0,4,7,3,
4,0,1,4,1,5,
3,7,2,2,7,6
};
// 将正方体的三角形索引添加到共享的三角形索引数组中
for (int j = 0; j < cubeTriangles.Length; j++)
{
triangles[index + j] = baseIndex + cubeTriangles[j];
}
index += 36;
}
return triangles;
}
}