找回密码
 立即注册
查看: 4634|回复: 6

[简易教程] 代码手绘圆柱体,draw cylinder in unity

[复制链接]
发表于 2020-4-3 15:31 | 显示全部楼层 |阅读模式
可自定义 半径、厚度、边数
  1. using System;
  2. using UnityEngine;
  3. #if UNITY_EDITOR
  4. using UnityEditor;
  5. using LitJson;
  6. #endif
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using System.Runtime;
  10. using UnityEngine.Experimental.U2D;

  11. [RequireComponent(typeof(MeshFilter))]
  12. [RequireComponent(typeof(MeshRenderer))]
  13. public class DeformReel : MonoBehaviour
  14. {
  15.     //老虎机转轮半径
  16.     public float radius = 1;

  17.     //老虎机轮子宽度
  18.     public float width = 1;

  19.     //老虎机轮子几个边
  20.     public int side = 8;

  21.     //轮子是否镂空 系数
  22.     public float thickness = 0;

  23.     // Start is called before the first frame update
  24.     void Start()
  25.     {
  26.         Main();
  27.     }

  28.     // Update is called once per frame
  29.     void Update()
  30.     {
  31.     }


  32.     void OnValidate()
  33.     {
  34.         Main();
  35.     }

  36.     void Main()
  37.     {
  38.         MeshFilter mf = this.gameObject.GetComponent<MeshFilter>();
  39.         Mesh mesh = mf.mesh;
  40.         mesh.Clear();
  41.         List<Vector3> listVertexOneDmt = new List<Vector3>();
  42.         //圆柱体
  43.         if (thickness == 0)
  44.         {
  45.             int singleIdx = 0;
  46.             for (int i = 0, lenI = (side + 1) * 2; i < lenI; i++)
  47.             {
  48.                 //y z轴面的中心点
  49.                 if (i == 0)
  50.                 {
  51.                     listVertexOneDmt.Add(new Vector3(width / 2f, 0, 0));
  52.                 }
  53.                 //y z轴面的从上顺时针顶点
  54.                 else if (i < lenI / 2)
  55.                 {
  56.                     listVertexOneDmt.Add(new Vector3(width / 2f,
  57.                         Mathf.Cos(360f / side * (i - 1) * Mathf.PI / 180f) * radius,
  58.                         Mathf.Sin(360f / side * (i - 1) * Mathf.PI / 180f) * radius));
  59.                 }
  60.                 //反面的点
  61.                 else
  62.                 {
  63.                     listVertexOneDmt.Add(new Vector3(-listVertexOneDmt[i - lenI / 2].x,
  64.                         listVertexOneDmt[i - lenI / 2].y,
  65.                         listVertexOneDmt[i - lenI / 2].z));
  66.                 }
  67.             }

  68.             //side*4个三角形 side*4*3个点
  69.             int[] triangles = new int[side * 3 * 4];
  70.             for (int i = 0, lenI = triangles.Length; i < lenI; i++)
  71.             {
  72.                 triangles[i] = 0;
  73.             }

  74.             int[] sides = new int[side + 1];
  75.             //0 1 2 3 4 5 6
  76.             for (int i = 0, lenI = sides.Length; i < lenI; i++)
  77.             {
  78.                 sides[i] = i;
  79.             }

  80.             //y z轴的三角区域  6*3=18  右侧边的6个三角形参数
  81.             //[(0,1,2),(0,2,3),(0,3,4),(0,4,5),(0,5,6),(0,6,1)]
  82.             for (int i = 0, lenI = side; i < lenI; i++)
  83.             {
  84.                 for (int j = 0, lenJ = 3; j < lenJ; j++)
  85.                 {
  86.                     if (j == 0)
  87.                     {
  88.                         triangles[i * 3 + j] = 0;
  89.                     }
  90.                     else if (j == 1)
  91.                     {
  92.                         triangles[i * 3 + j] = i + 1;
  93.                     }
  94.                     else
  95.                     {
  96.                         triangles[i * 3 + j] = i + 2 > side ? 1 : i + 2;
  97.                     }
  98.                 }
  99.             }

  100.             //7 8 9 10 11 12 13
  101.             for (int i = 0, lenI = sides.Length; i < lenI; i++)
  102.             {
  103.                 sides[i] = i + side + 1;
  104.             }

  105.             //y z轴的三角区域  6*3=18  左侧边的6个三角形参数
  106.           //(7,9,8) ,(7,10,9),(7,11,10),(7,12,11),(7,13,12),(7,8,13)
  107.             for (int i = side, lenI = side * 2; i < lenI; i++)
  108.             {
  109.                 for (int j = 0, lenJ = 3; j < lenJ; j++)
  110.                 {
  111.                     if (j==0)
  112.                     {
  113.                         triangles[i * 3 + j] = side+1;
  114.                     }
  115.                     else if (j==1)
  116.                     {
  117.                         triangles[i * 3 + j] = i+3>side*2+1?side+2:i+3;
  118.                     }
  119.                     else
  120.                     {
  121.                         triangles[i * 3 + j] = i+2 ;
  122.                     }
  123.                 }
  124.             }

  125.             //1,2,3,4,5,6
  126.             sides = new int[side];
  127.             for (int i = 1, lenI = side; i <= lenI; i++)
  128.             {
  129.                 sides[i - 1] = i;
  130.             }
  131.             //(2,1,8) (3,2,9) (4,3,10) (5,4,11) (6,5,12) (1,6,13)

  132.             for (int i = side * 2, lenI = side * 3; i < lenI; i++)
  133.             {
  134.                 for (int j = 0, lenJ = 3; j < lenJ; j++)
  135.                 {
  136.                     if (j == 0)
  137.                     {
  138.                         triangles[i * 3 + j] = (i - side * 2) + 2>side?1: (i - side * 2) + 2;
  139.                     }
  140.                     else if(j==1)
  141.                     {
  142.                         triangles[i * 3 + j] =  (i - side * 2) + 1;
  143.                     }
  144.                     else
  145.                     {
  146.                         triangles[i * 3 + j] =  (i - side * 2)  +side+2;
  147.                     }
  148.                 }
  149.             }

  150.             //8,9,10,11,12,13
  151.             for (int i = 1, lenI = side; i <= lenI; i++)
  152.             {
  153.                 sides[i - 1] = i + side + 1;
  154.             }

  155.             //(8,9,2) (9,10,3) (10,11,4) (11,12,5) (12,13,6) (13,8,1)
  156.             for (int i = side * 3, lenI = side * 4; i < lenI; i++)
  157.             {
  158.                 for (int j = 0, lenJ = 3; j < lenJ; j++)
  159.                 {
  160.                     if (j == 2)
  161.                     {
  162.                         triangles[i * 3 + j] = (i - side * 3 + 2) > (side) ? 1 : (i - side * 3 + 2);
  163.                     }
  164.                     else if (j == 0)
  165.                     {
  166.                         triangles[i * 3 + j] = i - side * 3 + side + 2;
  167.                     }
  168.                     else if (j == 1)
  169.                     {
  170.                         triangles[i * 3 + j] = (i - side * 3 + side + 3) > ((side) * 2 + 1)
  171.                             ? (side + 2)
  172.                             : (i - side * 3 + side + 3);
  173.                     }
  174.                 }
  175.             }

  176.             Debug.Log(" mesh.triangles:" + JsonMapper.ToJson(triangles));
  177.             mesh.vertices = listVertexOneDmt.ToArray();
  178.             mesh.triangles = triangles;
  179.         }


  180.         // mesh.uv = uvs;
  181.         mesh.RecalculateBounds();
  182.         mesh.RecalculateNormals();
  183.     }
  184. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 楼主| 发表于 2020-4-9 11:26 | 显示全部楼层
发表于 2020-6-15 09:08 | 显示全部楼层
先下来试试看
发表于 2020-6-15 09:58 | 显示全部楼层
666666666~好好好
发表于 2020-6-15 09:48 | 显示全部楼层
感谢楼主的分享!
发表于 2020-6-15 09:41 | 显示全部楼层
感谢楼主的分享!
发表于 2020-6-15 09:49 | 显示全部楼层
感谢感谢感谢感谢!
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-18 06:30 , Processed in 0.095833 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表