using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;/** *           5* * *   6       0       4* * *      1    2    3*      * *
*/public class UIPropWidget : Graphic
{   private const int VERTEX_SIZE = 8;                  // 必须为4的倍数  通过绘制两个四边形组成一个五边形private List<Vector2> _currentList = new List<Vector2>();private Vector2 vec0 = new Vector2(0, 0);private Vector2 vec1;private Vector2 vec2;private Vector2 vec3;private Vector2 vec4;private Vector2 vec5;private Vector2 vec6;private float cos18;private float sin18;private float cos36;private float sin36;private float rate = 1f;private float radius = 100f;void Awake(){Init();}void Update(){SetVerticesDirty();}public void Init(){ float angle36 = 36*Mathf.PI/180;float angle18 = 18*Mathf.PI/180;cos18 = Mathf.Cos(angle18);sin18 = Mathf.Sin(angle18);cos36 = Mathf.Cos(angle36);sin36 = Mathf.Sin(angle36); vec1 =  new Vector2(-radius*sin36*rate, -radius*cos36*rate);vec3 =  new Vector2(radius*sin36*rate, -radius*cos36*rate);vec4 =  new Vector3(radius*cos18*rate, radius*sin18*rate);vec5 =  new Vector3(0, radius*rate);vec6 =  new Vector3(-radius*cos18*rate, radius*sin18*rate);//通过两点式算出1,3直线与y轴的交点vec2 =  new Vector2(0, (0 - vec1.x)/(vec3.x - vec1.x)*(vec3.y - vec1.y) + vec1.y);_currentList.Add(vec1);_currentList.Add(vec2);_currentList.Add(vec5);_currentList.Add(vec6);_currentList.Add(vec2);_currentList.Add(vec3);_currentList.Add(vec4);_currentList.Add(vec5);SetVerticesDirty();}private void UpdateVertex(List<UIVertex> vbo, List<Vector2> list){// 必须要保证填充的是4的倍数for (int i = 0; i < VERTEX_SIZE; ++i) {var vert = UIVertex.simpleVert;vert.color = color;vert.position = list[i];vbo.Add(vert);}}protected override void OnFillVBO(List<UIVertex> vbo){       UpdateVertex(vbo, _currentList);}
}

一个CanvasRenderer进行绘制,所有的控件和可显示的元素都是Graphic。Graphic持有一个canvasRenderer,通过SetVertices设置顶点,最终完成绘制。 举例来说,Image控件就是一个Graphic,这个GameObject上面同时还有一个CanvasRenderer,两者结合起来最终把图片绘制完成。

以五边形中心点为原点,求出五个顶点1, 4, 3, 6, 7以及底边中心点2的位置
因为uGUI的绘制元素是Quad而不是三角形,SetVertices中设置的顶点数目必须是4的倍数,所以用他们组成两个四边形 1,2,3,4和5,6,7,8用这两个四边形组成一个五边形
给的坐标是相对于自己的坐标系的像素坐标(相对于自已的privot)假设我要绘制一个100*100的矩形,privot是(0.5,0.5),四个顶点的坐标则分别为(-50,-50),(50, -50),(50, 50),(-50, 50)

最后补充一些关于vertex设置的知识点。
一个控件的GameObject上面只允许有一个Graphic,所以不可能同时存在Image和Text。 我们自定义形状的控件可以通过两种方式来实现,一种是重载Graphic,这样这个控件就与Image等价,这里有两个比较重要的可以重载的函数 UpdateGeometry和OnFillVBO。如果看下uGUI的源代码可以发现,UpdateGeometry其实就是获取一个List,调用OnFillVBO设置顶点数据,再调用所有的BaseVertexEffect组件进行顶点修改,最后传递给canvasRenderer。 OnFillVBO就是我们常用的设置顶点的地方,只要在里面给vbo的参数Add数据就可以了,重复一下上文说过的,Add的数目必须是4的倍数。 Image和Text都是通过这里设置顶点数据的。

上面有提到BaseVertexEffect,这个就是另外一个可以修改顶点信息的地方,它是一个修饰的组件,以Text和Outline为例,Text是一个Graphic,在控件上面添加的Outline就是一个BaseVertexEffect,Graphic在运行的时候会获取控件上面所有的BaseVertexEffect,然后设置顶点的时候依次调用。 我们可以实现一个自定义效果,继承自BaseVertexEffect,然后重载ModifyVertex函数进行顶点设置。

原文链接

使用UGUI自定义五边形相关推荐

  1. android 自定义五边形图片,Android自定义View-蜘蛛网属性图(五边形图)

    首先看看效果图: 这里写图片描述 先简要说一下这里需要涉及到的知识点: 高中基本的三角函数 Sin,Cos. 参考的文章: 这里为了尊重上面这篇文章的作者,需要说明一下,下面的代码有部分是参考上面这篇 ...

  2. UGUI自定义组件之Image根据Text大小自动调整

    文章目录[点击展开](?)[+] 需求分析 在之前的文章中,介绍到可以使用UGUI自带的ContentSizeFitter组件,进行Button根据Text的长度自适应, UGUI ContentSi ...

  3. UGUI 自定义 美术字

    1: 工具: bmfont 2:bmfont中 英文,数字用ASCII码10进制来表示,汉字用UTF8码10进制数据来表示.

  4. UGUI组件之快速消息提示(飘字)

    文章目录[点击展开](?)[+] 效果预览 quickmsg 使用情景 几乎每一个游戏都会有这种飘字提示,实现起来并不复杂, 我把它做了一个组件. 开箱即可使用,无需二次开发,如果效果不满意,开放源码 ...

  5. h5页面的雷达图 五边形_程序丨以五边形为例,使用UGUI绘制多边形雷达图

    使用UGUI绘制多边形(这里以五边形为例子), 首先我们先看一下UGUI里的绘制一张图片需要实现的一个函数. protected override void OnPopulateMesh(Vertex ...

  6. 【Unity】UGUI 如何使用CustomFont(自定义字体)

    说在前面 若是转载 ,请注明出自喵喵丸的博客 (http://blog.csdn.net/u011643833/article/details/49102423) 正体 最近需求做一个界面上Text, ...

  7. 使用UGUI绘制自定义几何图形

    本文展示了如何使用UGUI绘制矩形,同理可绘制其他几何图形. UGUI的渲染体系,简单来说所有的控件和可显示的元素都是Graphic.Graphic持有一个CanvasRenderer,通过SetVe ...

  8. 用uGUI开发自定义Toggle Slider控件

    一.前言 写完<Unity4.6新UI系统初探>后,我模仿手机上的UI分别用uGui和NGUI做了一个仅用作演示的ToggleSlider,我认为这个小小的控件已能体现自定义控件的开发过程 ...

  9. android 正五边形图表,Android 自定义View 仿蚂蚁信用分析----正多边形绘制

    支付宝芝麻信用分-分析中,有个正五边形,试着做了下 效果图: 分析图: 已知半径为R,圆心点O(a,b),点A(a, c=b-R), OA=OB=R,圆心角O的度数 > 求出弦AB的长度 > ...

最新文章

  1. 2021年举行的第一场智能车校内赛 - 上海海事大学
  2. 关于重装系统或还原系统
  3. 截取字符串指定内容,并用*号代替
  4. boost::kruskal_minimum_spanning_tree用法的测试程序
  5. php5.4以下,json_encode不转义实现方法
  6. 命令重置_学个简单命令,一秒重置账户密码
  7. Jmeter系列之接口自动化实战
  8. SQL Server 2012 T-SQL 新特性
  9. 嵌入式软件工程师岗位笔试、面试题(1)
  10. 免费智能购物网站管理工具:京东助手+淘宝试用助手+苏宁试用助手
  11. Stata资源:一些不错的Stata-Blogs
  12. CString与char之间的转换
  13. php实现迅雷链接的加密解密
  14. 【校内模拟】五彩斑斓(拓扑排序)
  15. (银行案例)智能营销赋能大零售转型
  16. 2015北邮计算机考研复试上机题解
  17. 二十岁、我的青春散场
  18. 常见开关电源优缺点对比
  19. 【Socket网络编程进阶与实战】------ Socket网络编程快速入门
  20. Ubuntu中使用RoboMongo实现MongoDB的可视化

热门文章

  1. 浅谈站长如何学会判断网站的价值
  2. 虫师Selenium2+Python_8、自动化测试高级应用
  3. Linux进程间的6种通信方式
  4. dcl java_Java内存模型之从JVM角度分析DCL
  5. 从零开始之驱动发开、linux驱动(三十三、PWM子系统)
  6. linux或者windows获取唯一硬件信息-命令行和c++代码
  7. matlab之灰色关联分析法
  8. Eyeshot 2022.1.376 Crack Eyeshot Ultimate
  9. 推荐一个数学网站---数学知识
  10. 关于vscode的Live Server插件时出现Open a folder or workspace... (File -> Open Folder)报错处理方法