最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity3D動態(tài)生成平面網(wǎng)格

 更新時間:2019年02月22日 09:54:37   作者:星空不語  
這篇文章主要為大家詳細介紹了Unity3D動態(tài)生成平面網(wǎng)格,具有一定的參考價值,感興趣的小伙伴們可以參考一下

在編寫幾何著色器的時候發(fā)現(xiàn)默認的Plane無法滿足需求,并且頂點順序未知,于是便寫了一個網(wǎng)格生成代碼,便于生成指定大小的Plane,且頂點順序可控。

效果如下:

一個單元格由4個頂點,兩個三角面組成。

四個頂點如下圖

則生成面的頂點順序為:

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

Unity中順時針繪制為正面,逆時針繪制為反面。

實現(xiàn)腳本如下:

//PlaneBuilder.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

#region Editor

#if UNITY_EDITOR

using 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("更新網(wǎng)格"))
 {
  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>
 /// 網(wǎng)格大小
 /// </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;

 //計算頂點及UV
 List<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;//計算頂點紋理坐標(biāo)V

  for (int x = 0; x < _gridSize.x + 1; x++)
  {
  vertice.x = x * _cellSize.x - halfSize.x;//計算頂點X軸
  uv.x = x * _cellSize.x / size.x;//計算頂點紋理坐標(biāo)U

  vertices.Add(vertice);//添加到頂點數(shù)組
  uvs.Add(uv);//添加到紋理坐標(biāo)數(shù)組
  }
 }

 //頂點序列
 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;//0
  b = (y + 1) * (_gridSize.x + 1) + x;//1
  c = b + 1;//2
  d = a + 1;//3

  //計算在數(shù)組中的起點序號
  startIndex = y * _gridSize.x * 2 * 3 + x * 2 * 3;

  //左上三角形
  indexs[startIndex] = a;//0
  indexs[startIndex + 1] = b;//1
  indexs[startIndex + 2] = c;//2

  //右下三角形
  indexs[startIndex + 3] = c;//2
  indexs[startIndex + 4] = d;//3
  indexs[startIndex + 5] = a;//0
  }
 }

 //
 mesh.SetVertices(vertices);//設(shè)置頂點
 mesh.SetUVs(0, uvs);//設(shè)置UV
 mesh.SetIndices(indexs, MeshTopology.Triangles, 0);//設(shè)置頂點序列
 mesh.RecalculateNormals();
 mesh.RecalculateBounds();
 mesh.RecalculateTangents();

 _meshFilter.mesh = mesh;
 }

#if UNITY_EDITOR

 private 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
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)刪除文件和目錄到回收站

    C#實現(xiàn)刪除文件和目錄到回收站

    這篇文章主要為大家詳細介紹了如何使用C#實現(xiàn)刪除文件和目錄到回收站,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-01-01
  • C#實現(xiàn)簡單的飛行棋小游戲

    C#實現(xiàn)簡單的飛行棋小游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)簡單的飛行棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2021-11-11
  • C#中DateTime函數(shù)的詳細用法

    C#中DateTime函數(shù)的詳細用法

    這篇文章介紹了C#中DateTime函數(shù)的詳細用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#反射機制介紹

    C#反射機制介紹

    這篇文章介紹了C#的反射機制,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#獲取硬盤序列號的問題小結(jié)

    C#獲取硬盤序列號的問題小結(jié)

    本文給大家分享C#獲取硬盤序列號的問題及解決方法,非常不錯,需要的朋友參考下
    2016-12-12
  • C#和Java有什么區(qū)別和聯(lián)系

    C#和Java有什么區(qū)別和聯(lián)系

    這篇文章主要介紹了C#和Java有什么區(qū)別和聯(lián)系的相關(guān)資料,本文介紹的非常詳細,涉及到rsa語法,c#和java互轉(zhuǎn)方面的知識點,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實例

    C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實例

    這篇文章主要介紹了C#導(dǎo)入導(dǎo)出EXCEL文件代碼實例,代碼的流程和方法都很詳細,需要的朋友可以參考下
    2014-04-04
  • npoi2.0將datatable對象轉(zhuǎn)換為excel2007示例

    npoi2.0將datatable對象轉(zhuǎn)換為excel2007示例

    這篇文章主要介紹了npoi2.0將datatable對象轉(zhuǎn)換為excel2007示例的相關(guān)資料
    2014-04-04
  • C#使用itextsharp打印pdf的實現(xiàn)代碼

    C#使用itextsharp打印pdf的實現(xiàn)代碼

    提到打印,恐怕對于很多人都不會陌生,無論是開發(fā)者,還是非計算機專業(yè)的人員都會接觸到打印,?在.NET中實現(xiàn)PDF打印的組件比較多,例如PDFsharp、Report.NET、sharpPDF、itextSharp等等,今天主要簡單的介紹itextSharp組件,需要的朋友可以參考下
    2024-04-04
  • C# 文件下載之?dāng)帱c續(xù)傳實現(xiàn)代碼

    C# 文件下載之?dāng)帱c續(xù)傳實現(xiàn)代碼

    本篇文章主要介紹了C# 文件下載之?dāng)帱c續(xù)傳實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01

最新評論

会宁县| 南投市| 晋州市| 河源市| 五原县| 淳化县| 仪征市| 区。| 吴桥县| 高阳县| 济源市| 桃源县| 辽阳市| 秦皇岛市| 吉安市| 灌云县| 新野县| 聊城市| 新乐市| 霍邱县| 陆良县| 湖州市| 米脂县| 海丰县| 亚东县| 横峰县| 昌平区| 饶河县| 美姑县| 大田县| 鲁山县| 图片| 岳西县| 澄城县| 哈巴河县| 稻城县| 额尔古纳市| 湖南省| 勃利县| 开化县| 梅河口市|