需求: 游戏中经常有动态绘制不规则图形的需求,比如雷达图,折线图填充等等
方案: 继承UGUI的MaskableGraphic类,重写OnPopulateMesh方法,进行图形的绘制,绘制的原理是三角面的绘制(即三个顶点绘制一个三角面),因此在传顶点坐标参数的时候,要注意覆盖到每一个三角面
代码如下:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIDrawImage : MaskableGraphic
{
public class TrianglePoint
{
public Vector3 point0;
public Vector3 point1;
public Vector3 point2;
}
public List<TrianglePoint> points = new List<TrianglePoint>();
public void AddData(Vector3 p0, Vector3 p1, Vector3 p2)
{
points.Add(new TrianglePoint() { point0 = p0, point1 = p1, point2 = p2 });
}
public void Clear()
{
points.Clear();
this.Refresh();
}
public void Refresh()
{
this.SetAllDirty();
}
protected override void OnPopulateMesh(VertexHelper vh)
{
if (points == null || points.Count == 0)
{
base.OnPopulateMesh(vh);
return;
}
vh.Clear();
DrawIamge(vh);
}
//画图
private void DrawIamge(VertexHelper vh)
{
int length = points.Count;
for (int i = 0; i < length; i++)
{
this.DrawTriangle(vh, points[i], i);
}
}
/// <summary>
/// 画三角面
/// </summary>
private void DrawTriangle(VertexHelper vh, TrianglePoint p, int index)
{
vh.AddVert(p.point0, color, Vector2.zero);
vh.AddVert(p.point1, color, Vector2.zero);
vh.AddVert(p.point2, color, Vector2.zero);
vh.AddTriangle(index * 3, index * 3 + 1, index * 3 + 2);
}
}