• Mesh绘制五角星和简易特效


    目录

    1.绘制UI上的五角星

    1.1 思路分析

    1.2  绘制UI五角星的脚本

    1.3 UI上的五角星的效果

    2.绘制3D的五角星

    2.1  主要思路

    2.2  绘制3D五角星的脚本

    2.3  3D五角星效果展示

    3.五角星粒子特效

    3.1  新建一个粒子特效(Particle System)

    3.2  通过代码导出五角星Mesh

    3.2.1  通过在Editor文件夹下创建导出Mesh的脚本

    3.2.2  在菜单栏点击导出Mesh

    3.3  给粒子特效更换mesh模式,并给绘制的材质

    3.4  五角星粒子效果展示


    1.绘制UI上的五角星

    1.1 思路分析

    Mesh 绘制图形都是通过三角形来完成的,所以五角星我们得先知道它的顶点的规律,才能通过Mesh绘制出来。我们不难发现它是有十个顶点的,五个外顶点和五个内顶点,它们到圆心的距离是分别相等的。

    在这里我们可以考虑使用绘制雷达图的思路,通过(可遮罩图形)MaskableGraphic组件,来调整顶点到圆心的半径长度来达到我们的需求。通过我的计算,比较标准的外半径与内半径的比例是5:2。

    在Canvas下创建一个空对象UIStar,然后挂载绘制Mesh的脚本。

    1.2  绘制UI五角星的脚本

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEditor;
    4. using UnityEngine;
    5. using UnityEngine.UI;
    6. ///
    7. /// UI五角星
    8. ///
    9. [RequireComponent(typeof(CanvasRenderer))]
    10. public class DrawStar : MaskableGraphic
    11. {
    12. int num = 10; //分割数
    13. float rad; //弧度
    14. float r = 200; //半径
    15. [SerializeField]
    16. float[] raduis;
    17. protected override void Start()
    18. {
    19. base.Start();
    20. rad = 2 * Mathf.PI / num;
    21. raduis=new float[num];
    22. //通过计算得出五角星的长半径和短半径的最佳比例为5:2
    23. for (int i = 0; i < num; i++)
    24. {
    25. raduis[i] = i % 2 == 0 ? 100 :40;
    26. }
    27. }
    28. //重写材质属性贴图
    29. public override Texture mainTexture
    30. {
    31. get
    32. {
    33. return AssetDatabase.LoadAssetAtPath("Assets/xg2.jpg");
    34. }
    35. }
    36. protected override void OnPopulateMesh(VertexHelper vh)
    37. {
    38. vh.Clear();
    39. vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0.5f, 0.5f));
    40. for (int i = 0; i < num; i++)
    41. {
    42. float x = Mathf.Sin(rad * i) * r * (raduis[i] / 100);
    43. float y = Mathf.Cos(rad * i) * r * (raduis[i] / 100);
    44. vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2((x + r) / (2 * r), (y + r) / (2 * r)));
    45. if(i==0)
    46. {
    47. vh.AddTriangle(0, 1, num);
    48. }
    49. else
    50. {
    51. vh.AddTriangle(0, i, i + 1);
    52. }
    53. }
    54. }
    55. }

    1.3 UI上的五角星的效果

    我们可以通过计算得出的uv坐标来进行材质贴图,通过重写MaskableGraphic下的mainTexture属性,满足我们的各种需求。

    2.绘制3D的五角星

    2.1  主要思路

    与UI上不同,绘制3D的物体,我们不能使用雷达图的思路,只能通过计算出十个顶点来绘制图形。通过观察,我们能够发现,相邻的两点(外顶点和内顶点)的半径不同,同时它们的相对偏移量刚好会是分割弧度的一半(即相邻的两点弧度是分割弧度的一半)。通过这个规律,我们就能写出绘制的代码。(因为是绘制3D的物体,我这里绘制了正反两面)

    2.2  绘制3D五角星的脚本

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEditor;
    4. using UnityEngine;
    5. using UnityEngine.UI;
    6. ///
    7. /// 3D五角星
    8. ///
    9. [RequireComponent(typeof(MeshFilter))]
    10. [RequireComponent(typeof(MeshRenderer))]
    11. public class DrawStar3D : MonoBehaviour
    12. {
    13. int num = 5; //分割数
    14. float rad; //弧度
    15. float r1 = 5, r2 = 2;//长半径,短半径
    16. VertexHelper vh; //顶点辅助器
    17. Mesh mesh;
    18. void Start()
    19. {
    20. rad = 2 * Mathf.PI / num;
    21. mesh = new Mesh();
    22. vh = new VertexHelper();
    23. vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0.5f, 0.5f));
    24. for (int i = 0; i < num; i++)
    25. {
    26. //计算高点
    27. float x = Mathf.Sin(rad * i) * r1 ;
    28. float y = Mathf.Cos(rad * i) * r1;
    29. vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2((x + r1) / (2 * r1), (y + r1) / (2 * r1)));
    30. //计算低点
    31. float x2 = Mathf.Sin(rad * i+(rad/2)) * r2;
    32. float y2 = Mathf.Cos(rad * i+(rad/2)) * r2;
    33. vh.AddVert(new Vector3(x2, y2, 0), Color.white, new Vector2((x2 + r1) / (2 * r1), (y2 + r1) / (2 * r1)));
    34. }
    35. for (int i = 0; i < num*2 ; i++)
    36. {
    37. if (i == 0)
    38. {
    39. vh.AddTriangle(0, num*2, 1);
    40. vh.AddTriangle(0, 1, num*2);
    41. }
    42. else
    43. {
    44. vh.AddTriangle(0, i, i + 1);
    45. vh.AddTriangle(0, i + 1,i);
    46. }
    47. }
    48. vh.FillMesh(mesh);
    49. GetComponent().mesh = mesh;
    50. Material mat = new Material(Shader.Find("Standard"));
    51. GetComponent().material = mat;
    52. }
    53. void Update()
    54. {
    55. }
    56. }

    2.3  3D五角星效果展示

    3.五角星粒子特效

    3.1  新建一个粒子特效(Particle System)

    3.2  通过代码导出五角星Mesh

    3.2.1  通过在Editor文件夹下创建导出Mesh的脚本

    脚本与上面绘制3D五角星几乎一致,这里不多描述了。

    ExportMesh脚本代码:

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEditor;
    4. using UnityEngine;
    5. using UnityEngine.UI;
    6. public class ExportMesh : MonoBehaviour
    7. {
    8. [MenuItem("特效/ExportStar")]
    9. public static void ExportStar()
    10. {
    11. int num = 5; //分割数
    12. float rad; //弧度
    13. float r1 = 5, r2 = 2;//外半径,内半径
    14. VertexHelper vh = new VertexHelper();
    15. Mesh mesh = new Mesh();
    16. rad = 2 * Mathf.PI / num;
    17. vh.AddVert(new Vector3(0, 0, 0), Color.white, new Vector2(0.5f, 0.5f));
    18. for (int i = 0; i < num; i++)
    19. {
    20. //外顶点
    21. float x = Mathf.Sin(rad * i) * r1;
    22. float y = Mathf.Cos(rad * i) * r1;
    23. vh.AddVert(new Vector3(x, y, 0), Color.white, new Vector2((x + r1) / (2 * r1), (y + r1) / (2 * r1)));
    24. //内顶点
    25. float x2 = Mathf.Sin(rad * i + (rad / 2)) * r2;
    26. float y2 = Mathf.Cos(rad * i + (rad / 2)) * r2;
    27. vh.AddVert(new Vector3(x2, y2, 0), Color.white, new Vector2((x2 + r1) / (2 * r1), (y2 + r1) / (2 * r1)));
    28. }
    29. for (int i = 0; i < num * 2; i++)
    30. {
    31. if (i == 0)
    32. {
    33. vh.AddTriangle(0, num * 2, 1);
    34. vh.AddTriangle(0, 1, num * 2);
    35. }
    36. else
    37. {
    38. vh.AddTriangle(0, i, i + 1);
    39. vh.AddTriangle(0, i + 1, i);
    40. }
    41. }
    42. vh.FillMesh(mesh);
    43. //导出资源
    44. AssetDatabase.CreateAsset(mesh, "Assets/星星.asset");
    45. AssetDatabase.Refresh();
    46. }
    47. }

    3.2.2  在菜单栏点击导出Mesh

    这里我们能在Assets文件夹里面找到导出来的Mesh资源。

    3.3  给粒子特效更换mesh模式,并给绘制的材质

    这里选择Mesh模式,并给Meshs赋值 刚导出的星星mesh。

    当然,这里设置完成后,也可以根据自己的需求自行设置一些特效的属性值。

    3.4  五角星粒子效果展示

    星星特效

  • 相关阅读:
    启山智软/微信小程序商城源码(微信小程序)
    C++多线程学习09 条件变量
    Emiya 家今天的饭(计数4, dp19)
    包裹骨髓间充质干细胞/捕获内源性细胞因子的磺化/载有活性蛋白的壳聚糖水凝胶的制备与研究
    COOIS 生产订单显示系统增强
    Helm的安装和使用
    java字符串(String & StringBuilder)
    Ubuntu16.04-64位操作系统上安装Cadence Conformal10.1教程
    网络基础入门理解
    手刻 Deep Learning -第壹章 -PyTorch教学-激励函数与感知机入门(上)
  • 原文地址:https://blog.csdn.net/2302_81889789/article/details/140324384