最近工程需要用到一个多边形用来查看角色属性,于是就研究了下Mesh用网格做了一个。遗憾的的 UGUI 渲染不了 3D 物体,然后又用了一段时间研究了下UGUI的网格绘制。

不过终于还是完成了,虽然有些瑕疵…… 好吧 有很大的问题 UV 需要自己计算。(如果有朋友精通这一块,希望能帮忙改进一下)

下边是5.2以下版本使用 的

5.2(包括)以上的 请点击这个连接

 在Unity中一个Mesh使用3个顶点就能画出来,但是UGUI需要使用四个顶点才行,所以在画一些特殊模型的时候就会产生一些废点(对图形没影响但是必须存在)。

下面要开始了。额……再等等,先让我借用几张图

Ok 先上使用教

先添加个这个

然后在这下边创建个空物体

然后添加这个脚本

然后就可以编辑这个脚本的属性 实现不同的多边形啦

使用polygon脚本 可以实现很多种形状 比如这些:

注意:上边这些都是UGUI,并不是模型网格;

5.2的UGUIAPI改动比较大所以不能想想兼容,我是在原作者的代码基础上改的。(希望原作者不会介意……额 我还是发个邮件说一下吧!!!!!!)

使用步骤和上边一样,这两个具有相同的问题就是UV的贴的时候没有贴好(原谅我这个数学渣渣),在原基础上增加了顶点网格的设置,其余的没有更改。

5.2(包涵)以上版本的 在上边的连接可以下载到 ,下边是5.2以下版本的。

 

//*********************************************************************
//
// ScriptName : UIPolygonPast
//
// 筱程
//
//********************************************************************* using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
public class UIPolygonPast : MaskableGraphic
{ List<Vector2> pointPosition = new List<Vector2>();
List<Vector2> Vertex = new List<Vector2>();
List<Vector2> UV = new List<Vector2>();
// 是否使用顶点画 默认是不使用
// 使用需要用户自己传入顶点位置
// 否则会根据顶点数目 以零点位置自动计算圆形顶点位置
[SerializeField]
Texture m_Textrue; public bool usingVertex; // 是否中空
public bool fill = true; // 顶点数目
[Range(, )]
public int sides = ;
// 选择角度
[Range(, )]
public float Rotation = ;
// 边缘厚度
[Range(, )]
public float Thickness = ;
// 顶点距离
[Range(, )]
public float[] VerticesDistances = new float[]; private float size = 1f;
public override Texture mainTexture {
get {
return m_Textrue == null ? s_WhiteTexture : m_Textrue;
}
}
public Texture texture {
get {
return m_Textrue;
}
set {
if (m_Textrue == value)
return;
m_Textrue = value;
SetVerticesDirty();
SetMaterialDirty();
}
}
/// <summary>
/// 设置图片顶点
/// </summary>
/// <param name="_Vertex"></param>
public void DrwaPolyonVertex(List<Vector2> _Vertex) {
DrwaPolyonVertex(_Vertex, null);
}
/// <summary>
/// 设置图片顶点
/// </summary>
/// <param name="_Vertex">顶点</param>
/// /// <param name="_UV">UI</param>
public void DrwaPolyonVertex(List<Vector2> _Vertex,List<Vector2> _UV) {
Vertex = _Vertex;
UV = _UV;
usingVertex = true;
}
/// <summary>
/// 设置顶点数目
/// </summary>
/// <param name="_sides"></param>
public void DrwaPolygon(int _sides) {
DrwaPolygon(_sides, null);
}
/// <summary>
/// 设置顶点数目
/// </summary>
/// <param name="_sides"></param>
/// <param name="_VerticesDistances">顶点距离信息</param>
public void DrwaPolygon(int _sides, float[] _VerticesDistances) {
DrwaPolygon(_sides, _VerticesDistances, );
}
/// <summary>
/// 设置顶点数目
/// </summary>
/// <param name="_sides"></param>
/// <param name="_VerTicesDstances">顶点距离信息</param>
/// <param name="_Rotation">顶点旋转</param>
public void DrwaPolygon(int _sides, float[] _VerTicesDstances,float _Rotation) {
sides = _sides;
if (_VerTicesDstances != null)
VerticesDistances = _VerTicesDstances;
Rotation = _Rotation;
usingVertex = false;
}
private Vector2 CalculatedPosition(Vector2 p1, Vector2 p2, Rect rect) {
p1.x *= rect.width;
p1.y *= rect.height;
return p1;
} // UI网格都是四边形,所以需要四个顶点
// 但是我们只需要三个顶点,所以就需要添加一个废点
// 否则不能组成网格
// 最后所有点数的总和应该是4的倍数
protected override void OnFillVBO(List<UIVertex> vbo) {
vbo.Clear(); if (usingVertex) {
VerterxDrwa(ref vbo);
} else {
VerterxNumberDrwa(ref vbo);
}
}
// 用顶点画
private void VerterxDrwa(ref List<UIVertex> vbo) {
Vector2 pos1 = Vector2.zero;
Vector2 pos2 = Vector2.zero;
Vector2 pos3 = Vector2.zero;
Vector2 pos4 = Vector2.zero;
if (Vertex.Count == ) {
pointPosition.Clear();
pointPosition.Add(new Vector2(, -) / 2f);
pointPosition.Add(new Vector2(-, -0.5f) / 2f); pointPosition.Add(new Vector2(-, 0.5f) / 2f);
pointPosition.Add(new Vector2(, ) / 2f);
pointPosition.Add(new Vector2(, 0.5f) / 2f);
pointPosition.Add(new Vector2(, -0.5f) / 2f);
} else {
pointPosition.Clear();
pointPosition = Vertex;
} for (int i = ; i < pointPosition.Count; i++) {
Vector2 pos = pointPosition[i];
pointPosition[i] = CalculatedPosition(pos, rectTransform.pivot, rectTransform.rect);
}
int count = pointPosition.Count;
Vector2 uv1 = new Vector2(, );
Vector2 uv2 = new Vector2(, );
Vector2 uv3 = new Vector2(, );
Vector2 uv4 = new Vector2(, );
for (int i = ; i < count - ; i++) { pos1 = pointPosition[i];
pos2 = pointPosition[i] + ( pointPosition[i] - Vector2.zero ) * -0.2f;
pos3 = Vector2.zero;
pos4 = pointPosition[i + ];
if (UV != null && count==UV.Count) {
uv3 = new Vector2(0.5f, 0.5f);
uv1 = UV[i];
uv4 = UV[i + ];
uv2 = uv1 + ( uv1 - uv3 ) * -0.2f;
}
AddUIVerterx(ref vbo, new Vector2[] { pos1, pos2, pos3, pos4 }, new Vector2[] { uv1, uv2, uv3, uv4 });
} pos1 = pointPosition[count - ];
pos2 = pointPosition[count - ] + ( pointPosition[count - ] - Vector2.zero ) * -0.2f;
pos3 = Vector2.zero;
pos4 = pointPosition[];
if (UV != null && count == UV.Count) {
uv1 = UV[count - ];
uv4 = UV[];
uv2 = uv1 + ( uv1 - uv3 ) * -0.2f;
}
AddUIVerterx(ref vbo, new Vector2[] { pos1, pos2, pos3, pos4 }, new Vector2[] { uv1, uv2, uv3, uv4 });
}
// 用顶点数画多边形
private void VerterxNumberDrwa(ref List<UIVertex> vbo) { float degrees = 360f / sides; size = rectTransform.rect.width > rectTransform.rect.height ? rectTransform.rect.height : rectTransform.rect.width;
Thickness = Mathf.Clamp(Thickness, , size / ); if (VerticesDistances == null || VerticesDistances.Length != sides + ) {
VerticesDistances = new float[sides + ];
for (int i = ; i < sides; i++)
VerticesDistances[i] = ;
}
VerticesDistances[sides] = VerticesDistances[];
Vector2 pos1 ;
Vector2 pos2 ;
Vector2 pos3 ;
Vector2 pos4 ;
Vector2 lastPosx = Vector2.zero;
Vector2 lastPosy = Vector2.zero;
Vector2 uv1 = new Vector2(, );
Vector2 uv2 = new Vector2(, );
Vector2 uv3 = new Vector2(, );
Vector2 uv4 = new Vector2(, );
//Vector2 lastuv = new Vector2(0.5f, 0.5f);
for (int i = ; i <= sides; i++) { float outer = -rectTransform.pivot.x * size * VerticesDistances[i];
float inner = -rectTransform.pivot.x * size * VerticesDistances[i] + Thickness;
float rad = Mathf.Deg2Rad * ( i * degrees + Rotation );
float c = Mathf.Cos(rad);
float s = Mathf.Sin(rad);
pos1 = lastPosx;
pos2 = new Vector2(outer * c, outer * s); if (fill) {
pos3 = Vector2.zero;
pos4 = Vector2.zero;
} else {
pos3 = new Vector2(inner * c, inner * s);
pos4 = lastPosy;
}
#region
//int x = (int) (pos1.x < 0 ? pos1.x * -1 : pos1.x * 2);
//int y = (int)( pos1.y < 0 ? pos1.y * -1 : pos1.y * 2 ); //float uvx = 0;
//float uvy = 0;
// if (x != 0) {
// uvx =x / size;
// }
// if (y != 0) {
// uvy =y / size;
// } //uv2 = new Vector2(uvx, uvy);
//uv1 = lastuv;
//lastuv = uv2;
#endregion
lastPosx = pos2;
lastPosy = pos3;
AddUIVerterx(ref vbo, new Vector2[] { pos1, pos2, pos3, pos4 }, new Vector2[] { uv1, uv2, uv3, uv4 });
}
}
private void AddUIVerterx(ref List<UIVertex> vbo, Vector2[] pos, Vector2[] uv = null) {
UIVertex vert = UIVertex.simpleVert;
for (int i = ; i < pos.Length; i++) {
vert.position = pos[i];
vert.color = color;
if (uv != null && uv.Length == pos.Length)
vert.uv0 = uv[i];
vbo.Add(vert);
}
}
}

Unity 绘制多边形的更多相关文章

  1. 用线框模式绘制多边形 glPolygonMode

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLES);//开始以g_ViewMode模式绘制 glColor3ub(182. ...

  2. [WebGL入门]十四,绘制多边形

    注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...

  3. canvas绘制多边形

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. leaflet简单例子,绘制多边形

    var crs = L.CRS.EPSG900913; var map = L.map('map', { crs: crs, width: '100%', height: '100%', maxZoo ...

  5. 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)

    [Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...

  6. 浅谈使用canvas绘制多边形

    本文主要使用坐标轴的使用来绘制多边形,点位则都是在y轴上寻找,这种方法能够更好的理解图形与修改. //id为html里canvas标签的属性id: //x,y为坐标轴的起始位置,因为canvas默认坐 ...

  7. JS实现鼠标点击爱心&绘制多边形&每日一言功能

    本篇文章主要介绍我的个人博客 程序猿刘川枫 中页面使用的美化功能(基于JS实现): 1.鼠标点击出现不同颜色爱心特效 2.页面浮动多边形跟随鼠标移动 3.每日一言功能 1.鼠标点击出现爱心特效 经常在 ...

  8. Unity动态构建mesh绘制多边形算法流程分析和实践

    前言 先说一下,写这篇博文的动机,原文的博主代码写的十分潇洒,以至于代码说明和注释都没有,最近恰逢看到,所以以此博文来分析其中的算法和流程 参考博文:https://blog.csdn.net/lin ...

  9. unity 绘制三角形

    哎 该学的还是要学 参考:http://www.narkii.com/club/thread-369573-1.html unity 顶点绘制三角形 脚本绘制; 其实filter和render就是进行 ...

随机推荐

  1. PM产品经理练级攻略(1-5等级)

    大家都叫“PM”,但做的事情却完全不同? “PM”这个词到底是什么意思? 这个话题恐怕也是各位同行都一直在想,也一直想不清楚的吧,我也是. 每次看到各种“产品经理的能力模型”,我都觉得有点扯淡,总觉得 ...

  2. Seafile 推出 “分布式文件同步技术” 打造的私有云服务

    近两年来 Dropbox 等云储存服务迅速窜红,各大巨头纷纷推出自家的云储存服务(苹果的 iCloud, 微软的 SkyDrive, Google 即将推出的 GDrive),国内也有类似的服务(金山 ...

  3. xhost

    xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显 ...

  4. JIRA官方:JIRA报表与分析

    访问重要的问题 JIRA系统内置的过滤器可以使你快速访问最重要的问题.通过保存和收藏自定义的过滤器,你可以随时了解项目和团队的优先级. 保持团队同步 创建一个过滤器,可以保存你的任何搜索条件.通过分享 ...

  5. linux中的strings命令简介

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道 ...

  6. U盘量产的作用

    优盘量产:字面意思就是,批量生产优盘.是指批量对U盘主控芯片改写数据,如,写生产厂商信息.格式化等.而用来对U盘完成该操作的软件程序,顾名思义就是U盘量产工具.   U盘量产的作用:   电脑正确识别 ...

  7. J2EE学习的一部分--JDBC详细说明

    今天是关于我们JDBC相关知识,左右JDBC我想大家都很熟悉的,我记得在很早以前就开始使用它,我记得那是一个大二的学生做课程设计.但随后以完成任务,所以遇到的问题google,当时没有时间组织,下关于 ...

  8. CSDN博文大赛火爆开启

    俗话说的好,程序猿会写博,谁也挡不住! 是不是每一个开发人员都能写出好博文,这个非常难说,但能够肯定的是,能写出好博文的,一定是优秀的程序猿! 写作即思考,养成写博文的习惯,既能帮自己整理技术思路,也 ...

  9. Mysql安装时出现APPLY security settings错误

    在安装mysql数据库时,如果重新安装,很容易遇见apply security setting error(access denied for user 'root@localhost'(using  ...

  10. Emmet 插件使用教程

    1)使用 Emmet 生成 HTML 的语法详解生成 HTML 文档初始结构 HTML 文档的初始结构,就是包括 doctype.html.head.body 以及 meta 等内容.你只需要输入一个 ...