【Unity】Unity中修改网格的大小和倾斜网格

一、问题

unity中的网格(Grid)或者地面Plane组件,在使用时,都是正方形的网格,而且建立该网格后,在不改变Scale情况下,没发使其整体变大,而且也没法改变每个网格的大小,而且也没法使网格变成倾斜形状来适应多视角游戏的效果。

二、效果

下面是实现的效果

上面是网格建造系统的效果

三、代码

直接上代码

下面是更改网格大小的代码

csharp 复制代码
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;
        }
    }
}

下面是使网格倾斜角度的代码

csharp 复制代码
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();
    }
#endif

    void 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~

你的点赞就是我创作最大的动力~

相关推荐
NRatel4 小时前
亚马逊S3的使用简记(游戏资源发布更新)
游戏·unity·amazon s3
SmalBox10 小时前
【渲染流水线】[几何阶段]-[屏幕映射]以UnityURP为例
unity·渲染
SmalBox1 天前
【渲染流水线】[几何阶段]-[归一化NDC]以UnityURP为例
unity·渲染
SmalBox2 天前
【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
unity·渲染
霜绛3 天前
Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制
笔记·学习·unity·游戏引擎
谷宇.3 天前
【Unity3D实例-功能-移动】角色行走和奔跑的相互切换
游戏·unity·c#·unity3d·游戏开发·游戏编程
17岁的勇气3 天前
Unity Shader unity文档学习笔记(十九):粘土效果,任意网格转化成一个球(顶点动画,曲面着色器)
笔记·学习·unity·图形渲染·顶点着色器·曲面着色器
benben0443 天前
《Unity Shader入门精要》学习笔记一
unity·shader
YF云飞3 天前
Unity图片优化与比例控制全攻略
游戏·unity·游戏引擎·游戏程序·个人开发
SmalBox3 天前
【渲染流水线】[几何阶段]-[几何着色]以UnityURP为例
unity·渲染