在编写几何着色器的时候发现默认的Plane无法满足需求,并且顶点顺序未知,于是便写了一个网格生成代码,便于生成指定大小的Plane,且顶点顺序可控。

效果如下:

一个单元格由4个顶点,两个三角面组成。

四个顶点如下图

则生成面的顶点顺序为:

  • 左上三角形:0 -> 1 -> 2
  • 右下三角形:2 -> 3 -> 0

    Unity中顺时针绘制为正面,逆时针绘制为反面。

实现脚本如下:

//PlaneBuilder.csusing System.Collections;
using System.Collections.Generic;
using UnityEngine;#region Editor#if UNITY_EDITORusing UnityEditor;[CustomEditor(typeof(PlaneBuilder))]
public class PlaneBuilderEditor : Editor
{public override void OnInspectorGUI(){PlaneBuilder builder = (PlaneBuilder)target;EditorGUI.BeginChangeCheck();base.OnInspectorGUI();if (EditorGUI.EndChangeCheck()){builder.UpdateMesh();}if (GUILayout.Button("更新网格")){builder.UpdateMesh();}}
}#endif#endregion Editor[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class PlaneBuilder : MonoBehaviour
{[SerializeField]private MeshFilter _meshFilter;[SerializeField]private MeshRenderer _meshRenderer;/// <summary>/// 单元格大小/// </summary>[SerializeField]private Vector2 _cellSize = new Vector2(1, 1);/// <summary>/// 网格大小/// </summary>[SerializeField]private Vector2Int _gridSize = new Vector2Int(2, 2);public MeshRenderer MeshRenderer{get{return _meshRenderer;}}public MeshFilter MeshFilter{get{return _meshFilter;}}private void Awake(){_meshFilter = GetComponent<MeshFilter>();_meshRenderer = GetComponent<MeshRenderer>();UpdateMesh();}public void UpdateMesh(){Mesh mesh = new Mesh();//计算Plane大小Vector2 size;size.x = _cellSize.x * _gridSize.x;size.y = _cellSize.y * _gridSize.y;//计算Plane一半大小Vector2 halfSize = size / 2;//计算顶点及UVList<Vector3> vertices = new List<Vector3>();List<Vector2> uvs = new List<Vector2>();Vector3 vertice = Vector3.zero;Vector2 uv = Vector3.zero;for (int y = 0; y < _gridSize.y + 1; y++){vertice.z = y * _cellSize.y - halfSize.y;//计算顶点Y轴uv.y = y * _cellSize.y / size.y;//计算顶点纹理坐标Vfor (int x = 0; x < _gridSize.x + 1; x++){vertice.x = x * _cellSize.x - halfSize.x;//计算顶点X轴uv.x = x * _cellSize.x / size.x;//计算顶点纹理坐标Uvertices.Add(vertice);//添加到顶点数组uvs.Add(uv);//添加到纹理坐标数组}}//顶点序列int a = 0;int b = 0;int c = 0;int d = 0;int startIndex = 0;int[] indexs = new int[_gridSize.x * _gridSize.y * 2 * 3];//顶点序列for (int y = 0; y < _gridSize.y; y++){for (int x = 0; x < _gridSize.x; x++){//四边形四个顶点a = y * (_gridSize.x + 1) + x;//0b = (y + 1) * (_gridSize.x + 1) + x;//1c = b + 1;//2d = a + 1;//3//计算在数组中的起点序号startIndex = y * _gridSize.x * 2 * 3 + x * 2 * 3;//左上三角形indexs[startIndex] = a;//0indexs[startIndex + 1] = b;//1indexs[startIndex + 2] = c;//2//右下三角形indexs[startIndex + 3] = c;//2indexs[startIndex + 4] = d;//3indexs[startIndex + 5] = a;//0}}//mesh.SetVertices(vertices);//设置顶点mesh.SetUVs(0, uvs);//设置UVmesh.SetIndices(indexs, MeshTopology.Triangles, 0);//设置顶点序列mesh.RecalculateNormals();mesh.RecalculateBounds();mesh.RecalculateTangents();_meshFilter.mesh = mesh;}#if UNITY_EDITORprivate void OnValidate(){if (null == _meshFilter){_meshFilter = GetComponent<MeshFilter>();}if (null == _meshRenderer){_meshRenderer = GetComponent<MeshRenderer>();if (null == _meshRenderer.sharedMaterial){_meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));}}}#endif
}

[Unity3D]动态生成平面网格相关推荐

  1. 关于Unity3D动态生成连续性网格几何体总结【第三部分】(贴图篇)

    关于Unity3D动态生成连续性网格几何体总结[第三部分](贴图篇) 文章目录 关于Unity3D动态生成连续性网格几何体总结[第三部分](贴图篇) 前言 一.动态建立UV值 二.贴图的平铺与拉伸 二 ...

  2. Unity3D动态创建地形网格(一)

    Unity3D动态创建地形网格(一) 这次简单的写一个动态创建地形网格的脚本给大家分享一下. 这次是第一部分,仅仅实现了通过高度图动态生成地形的部分.假如以后有心情和时间,再来慢慢的补充多通道刷地形材 ...

  3. unity3d模拟树叶飘动_Unity3D独立游戏开发日记(一):动态生成树木

    目前写的独立游戏是一个沙盒类型的游戏.游戏DEMO视频如下: 提到沙盒类型的游戏,就有人给出了这样的定义: 游戏世界离现实世界越近,自由度.随机度越高才叫沙盒游戏.所谓自由度,就是你在游戏里想干啥就干 ...

  4. Unity Tilemap动态生成2d地图

    Unity Tilemap动态生成2d地图 (参考链接) rule tile 动态生成地图:https://blog.csdn.net/mkr67n/article/details/108340749 ...

  5. unity3d 动态合批设置_Unity动态合批(Dynamic Batching)与静态合批(Static Batching)

    动态合批与静态合批其本质是对将多次绘制请求,在允许的条件下进行合并处理,减少cpu对gpu绘制请求的次数,达到提高性能的目的. 1.静态合批是将静态(不移动)GameObjects组合成大网格,然后进 ...

  6. halcon中如何生成椭圆_教你动态生成椭圆,还教你怎么用海龟作图——GeoGebra制作教程...

    先看下面的动画演示,你能给出答案吗?海龟-文末有制作教程 这就涉及到椭圆是怎么来的! 什么是椭圆--将圆拉伸 / 压扁? 椭圆的定义是什么? 椭圆的定义平面内与两个定点F1,F2的距离的和等于常数(大 ...

  7. [Unity资源分享]动态生成树木,摆放建筑物

    这里的建造系统,可以 下载下 Unity Asset Store里面的资源,搜索关键字Build System.里面的免费的 资源,可以作为学习的参考. 参考资料: 1. Unity3D独立游戏开发日 ...

  8. ABAQUS软件实训(三):Mesh模块之圆形平面网格划分技巧

    一. 圆形平面网格划分技巧 点击Done之后,生成一个壳 切换到 Mesh模式中: 自动划分的网格中还有三角形等,质量不是特别高,这就需要人为去干预: 设置完成后再网格划分(注意去除前一次的mesh) ...

  9. Unity 代码动态生成模型

    网格由 3D 空间中排列的三角形组成,旨在产生实体对象的效果.三角形由其拐点或者顶点定义.在 Mesh 类中,顶点全部存储在单个数组中,并且每个三角形使用与顶点数组的索引对应的三个整数指定.这些三角形 ...

最新文章

  1. CEPH给用户创建读写权限
  2. 继承复习-发均分红包案例
  3. IntelliJ IDEA使用(二):tomcat和jetty配置(转自:http://www.cnblogs.com/jenkinschan/p/6052948.html)
  4. 为什么toString方法可以用来区分数组和对象?
  5. 映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)
  6. snownlp文本分词、情感分析、文本相似度与摘要生成
  7. 华为交换机重制_华为交换机重置命令
  8. Socket通信学习(一):Socket通信原理
  9. to load JavaHL Library解决方法
  10. Java如何将窗口居中显示
  11. 基于3D技术的机器视觉解决方案
  12. JavaScript函数 思维导图
  13. 一个手机阅读器的WebApp
  14. 【电机原理与拖动基础】Unit 2 直流电机的电力拖动系统
  15. templates模板文件
  16. springboot+mybatis事务管理
  17. C语言·abs()函数
  18. Python数据分析-LOL英雄画像 !
  19. 关于JAVA WEb如何连接Matlab
  20. nginx lua读redis

热门文章

  1. 【Echarts】绘制中国地图及各省份地图
  2. IOS根据两个经纬度计算相距距离
  3. SCSS 的使用语法
  4. 深度学习测试结果可视化分析——matplotlib 鼠标响应事件
  5. Hexo博客之butterfly主题优雅魔改系列(持续更新)
  6. opboot怎么刷入固件_华硕RT-AC58U免拆机刷OpBoot教程-免变砖
  7. css 2倍图 3倍图使用方法
  8. android .rar,手机压缩文档不用愁:RAR for Android
  9. [视频] 凯文.凯利 - 镜像世界: 未来互联网畅想 | 2021 百度 Create 大会
  10. 围炉夜话——《雨霖铃·寒蝉凄切》赏析