【Unity】Unity中修改网格的大小和倾斜网格
一、问题
unity中的网格(Grid)或者地面Plane组件,在使用时,都是正方形的网格,而且建立该网格后,在不改变Scale情况下,没发使其整体变大,而且也没法改变每个网格的大小,而且也没法使网格变成倾斜形状来适应多视角游戏的效果。
二、效果
下面是实现的效果
上面是网格建造系统的效果
三、代码
直接上代码
下面是更改网格大小的代码
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class ResizePlaneMesh : MonoBehaviour
{public float scaleFactorX = 2.0f; // 缩放系数public float scaleFactorY = 2.0f; // 缩放系数void Awake(){MeshFilter meshFilter = GetComponent<MeshFilter>();Mesh originalMesh = meshFilter.mesh;// 复制新网格避免修改原始资源Mesh newMesh = Instantiate(originalMesh);// 获取顶点并缩放Vector3[] vertices = newMesh.vertices;for (int i = 0; i < vertices.Length; i++){//vertices[i] *= scaleFactor;vertices[i].x *= scaleFactorX;vertices[i].y *= scaleFactorY;}newMesh.vertices = vertices;// 重新计算法线和包围盒newMesh.RecalculateNormals();newMesh.RecalculateBounds();// 应用新网格meshFilter.mesh = newMesh;// 更新碰撞体(如果有MeshCollider)MeshCollider meshCollider = GetComponent<MeshCollider>();if (meshCollider != null){meshCollider.sharedMesh = newMesh;}}
}
下面是使网格倾斜角度的代码
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class ParallelogramMesh : MonoBehaviour
{[Range(-1f, 1f)]public float skewAmount = 0.5f; // 倾斜系数(控制平行四边形的倾斜程度)private Mesh mesh;private Vector3[] originalVertices;void Start(){MeshFilter meshFilter = GetComponent<MeshFilter>();mesh = meshFilter.mesh;originalVertices = mesh.vertices;ApplySkew();}#if UNITY_EDITOR// 更新倾斜效果(可在 Inspector 中实时调整)void OnValidate(){if (mesh != null && originalVertices != null)ApplySkew();}
#endifvoid ApplySkew(){Vector3[] vertices = (Vector3[])originalVertices.Clone();// 对顶点进行倾斜变换(这里以 XZ 平面的平行四边形为例)for (int i = 0; i < vertices.Length; i++){// 根据顶点的 Z 坐标偏移 X 轴(模拟倾斜)vertices[i].x += vertices[i].z * skewAmount;}mesh.vertices = vertices;mesh.RecalculateNormals();mesh.RecalculateBounds();// 更新碰撞体(如果有 MeshCollider)MeshCollider meshCollider = GetComponent<MeshCollider>();if (meshCollider != null)meshCollider.sharedMesh = mesh;}
}
四、资源扩展
上面截图的建造系统中,玩家可以选择需要建造的建筑,然后按照网格地图,将建筑放入网格中,
下面是项目传送门Demo链接
Demo传送门
需要的可以自行点击下载查看
Over~
你的点赞就是我创作最大的动力~