Unity Canvas UI line Renderer
来源:互联网 发布:大学 知乎 编辑:程序博客网 时间:2024/05/24 00:59
- // from http://forum.unity3d.com/threads/new-ui-and-line-drawing.253772/
- using UnityEngine;
- using UnityEngine.UI;
- using System.Collections.Generic;
- public class UILineRenderer : Graphic
- {
- [SerializeField] Texture m_Texture;
- [SerializeField] Rect m_UVRect = new Rect(0f, 0f, 1f, 1f);
- public float LineThickness = 2;
- public bool UseMargins;
- public Vector2 Margin;
- public Vector2[] Points;
- public bool relativeSize;
- public override Texture mainTexture
- {
- get
- {
- return m_Texture == null ? s_WhiteTexture : m_Texture;
- }
- }
- /// <summary>
- /// Texture to be used.
- /// </summary>
- public Texture texture
- {
- get
- {
- return m_Texture;
- }
- set
- {
- if (m_Texture == value)
- return;
- m_Texture = value;
- SetVerticesDirty();
- SetMaterialDirty();
- }
- }
- /// <summary>
- /// UV rectangle used by the texture.
- /// </summary>
- public Rect uvRect
- {
- get
- {
- return m_UVRect;
- }
- set
- {
- if (m_UVRect == value)
- return;
- m_UVRect = value;
- SetVerticesDirty();
- }
- }
- //protected override void OnFillVBO(List<UIVertex> vbo)
- protected override void OnPopulateMesh(Mesh toFill)
- {
- // requires sets of quads
- if (Points == null || Points.Length < 2)
- Points = new[] { new Vector2(0, 0), new Vector2(1, 1) };
- var capSize = 24;
- var sizeX = rectTransform.rect.width;
- var sizeY = rectTransform.rect.height;
- var offsetX = -rectTransform.pivot.x * rectTransform.rect.width;
- var offsetY = -rectTransform.pivot.y * rectTransform.rect.height;
- // don't want to scale based on the size of the rect, so this is switchable now
- if (!relativeSize)
- {
- sizeX = 1;
- sizeY = 1;
- }
- // build a new set of points taking into account the cap sizes.
- // would be cool to support corners too, but that might be a bit tough :)
- var pointList = new List<Vector2> ();
- pointList.Add (Points [0]);
- var capPoint = Points [0] + (Points [1] - Points [0]).normalized * capSize;
- pointList.Add (capPoint);
- // should bail before the last point to add another cap point
- for (int i = 1; i < Points.Length-1; i++)
- {
- pointList.Add (Points [i]);
- }
- capPoint = Points [Points.Length-1] - (Points [Points.Length-1] - Points [Points.Length-2]).normalized * capSize;
- pointList.Add (capPoint);
- pointList.Add (Points [Points.Length - 1]);
- var TempPoints = pointList.ToArray ();
- if (UseMargins)
- {
- sizeX -= Margin.x;
- sizeY -= Margin.y;
- offsetX += Margin.x/2f;
- offsetY += Margin.y/2f;
- }
- toFill.Clear();
- var vbo = new VertexHelper(toFill);
- Vector2 prevV1 = Vector2.zero;
- Vector2 prevV2 = Vector2.zero;
- for (int i = 1; i < TempPoints.Length; i++)
- {
- var prev = TempPoints[i - 1];
- var cur = TempPoints[i];
- prev = new Vector2(prev.x * sizeX + offsetX, prev.y * sizeY + offsetY);
- cur = new Vector2(cur.x * sizeX + offsetX, cur.y * sizeY + offsetY);
- float angle = Mathf.Atan2(cur.y - prev.y, cur.x - prev.x) * 180f / Mathf.PI;
- var v1 = prev + new Vector2(0, -LineThickness / 2);
- var v2 = prev + new Vector2(0, +LineThickness / 2);
- var v3 = cur + new Vector2(0, +LineThickness / 2);
- var v4 = cur + new Vector2(0, -LineThickness / 2);
- v1 = RotatePointAroundPivot(v1, prev, new Vector3(0, 0, angle));
- v2 = RotatePointAroundPivot(v2, prev, new Vector3(0, 0, angle));
- v3 = RotatePointAroundPivot(v3, cur, new Vector3(0, 0, angle));
- v4 = RotatePointAroundPivot(v4, cur, new Vector3(0, 0, angle));
- Vector2 uvTopLeft = Vector2.zero;
- Vector2 uvBottomLeft = new Vector2(0, 1);
- Vector2 uvTopCenter = new Vector2(0.5f, 0);
- Vector2 uvBottomCenter = new Vector2(0.5f, 1);
- Vector2 uvTopRight = new Vector2(1, 0);
- Vector2 uvBottomRight = new Vector2(1, 1);
- Vector2[] uvs = new[]{ uvTopCenter,uvBottomCenter,uvBottomCenter,uvTopCenter };
- if (i > 1)
- SetVbo(vbo, new[] { prevV1, prevV2, v1, v2 }, uvs);
- if(i==1)
- uvs = new[]{ uvTopLeft,uvBottomLeft,uvBottomCenter,uvTopCenter };
- else if(i==TempPoints.Length-1)
- uvs = new[]{uvTopCenter,uvBottomCenter, uvBottomRight, uvTopRight };
- //SetVbo(vbo, new[] { v1, v2, v3, v4 }, uvs, toFill);
- vbo.AddUIVertexQuad(SetVbo(vbo, new[] { v1, v2, v3, v4 }, uvs));
- vbo.FillMesh (toFill);
- prevV1 = v3;
- prevV2 = v4;
- }
- }
- //protected void SetVbo(UIVertex vbo, Vector2[] vertices, Vector2[] uvs)
- protected UIVertex[] SetVbo(VertexHelper vbo, Vector2[] vertices, Vector2[] uvs)
- {
- UIVertex[] VboVertices = new UIVertex[4];
- for (int i = 0; i < vertices.Length; i++)
- {
- var vert = UIVertex.simpleVert;
- vert.color = color;
- vert.position = vertices[i];
- vert.uv0 = uvs [i];
- VboVertices[i] = vert;
- }
- return VboVertices;
- }
- public Vector3 RotatePointAroundPivot(Vector3 point, Vector3 pivot, Vector3 angles)
- {
- Vector3 dir = point - pivot; // get point direction relative to pivot
- dir = Quaternion.Euler(angles)*dir; // rotate it
- point = dir + pivot; // calculate rotated point
- return point; // return it
- }
- }
阅读全文
0 0
- Unity Canvas UI line Renderer
- unity使用line renderer画线
- Unity UI 系统--Canvas
- 【Unity】开发日志5——线性渲染 Line Renderer
- Unity基础,Line Renderer 和射线的应用
- Unity UI(三):Canvas
- Unity 扇形UI 360Canvas
- particle renderer line
- line renderer 画线
- Unity UGUI——UI基础,Canvas
- Unity游戏开发UI之Canvas
- Unity之Renderer组件
- line renderer实现贝塞尔曲线
- Unity新UI系统概述——Canvas
- Unity新UI系统概述——Canvas
- Unity 5.0新UI系统——Canvas
- Unity 访问2d组件 Sprite Renderer
- {Unity} Renderer SortingOrder的取值范围
- Git命令大全
- HDU6180(贪心)
- 教你避免内存泄露
- HTTP请求头和响应头
- PHP编程效率的20个要点 (2015-09-25 14:37:49) 转载 ▼ 用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,
- Unity Canvas UI line Renderer
- 前端对后台传过来是数组进行重新排序显示
- 【二叉树经典问题】106. Construct Binary Tree from Inorder and Postorder Traversal
- hdu6170(dp)
- spring cloud教程---Eureka
- pl sql
- angular2中ViewChild,索引值相关
- Spring Boot : CROS解决跨域问题(七)
- jzoj5336 【NOIP2017提高A组模拟8.24】提米树 (dfs序dp,奇异姿势dp)