用Mesh绘制几乘几的墙体

以下是用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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值