Unity UGUI绘制任意形状的基础——在代码中通过顶点绘制正方形

目标

在代码中通过顶点绘制正方形。基于这一技术,可以通过提供更多顶点绘制出任意形状。

环境

  • Unity 2018.1.5f1 Personal (64bit)

方法

继承 UnityEngine.UI.Graphic 来获得顶点操纵的能力:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UIMeshLine : Graphic
{

protected override void OnPopulateMesh(VertexHelper vh)
{
base.OnPopulateMesh(vh);
vh.Clear(); // 清除Graphic默认提供的正方形
var vertices = new UIVertex[4];
//var p0 = new UIVertex();
for (var i = 0; i < 4; i++)
{

vertices[i].color = color; // 设置颜色为 Inspector 中色条的颜色,也可以随便设置。比如 Color.green
}
// 上方缺角的正方形
//vertices[0].position = new Vector3(100, 100);
//vertices[1].position = new Vector3(100, 120);
//vertices[2].position = new Vector3(120, 100);
//vertices[3].position = new Vector3(120, 120);

// 正方形
vertices[0].position = new Vector3(100, 100);
vertices[1].position = new Vector3(120, 100);
vertices[2].position = new Vector3(120, 120);
vertices[3].position = new Vector3(100, 120);

// 正方形
//vertices[3].position = new Vector3(100, 100);
//vertices[2].position = new Vector3(120, 100);
//vertices[1].position = new Vector3(120, 120);
//vertices[0].position = new Vector3(100, 120);

Debug.Log("Current vertices count: " + vh.currentVertCount);
vh.AddUIVertexQuad(vertices);
Debug.Log("Modified vertices count: " + vh.currentVertCount);
}
}

效果:

OnPopulateMesh 是 Graphic 提供的虚方法,会由 Unity 调用。

UGUI的渲染体系。 简单来说,就是一个CanvasRenderer进行绘制,所有的控件和可显示的元素都是Graphic。Graphic持有一个canvasRenderer,通过SetVertices设置顶点,最终完成绘制。

设置的顶点格式是 UIVertex,包含 position、normal、color、uv0 等属性。最关键的就是 position,一般传一个点的坐标是相对于它自己的坐标系的像素坐标,不是全局坐标,也不是相对于父节点的坐标。举例来说,一张 100*100 的图片,锚点为(0.5,0.5),rect transform 的 position 是 (0, 0),那么它的四个UIVertex的值分别为 (-50, -50) (-50, 50) (50, 50) (50, -50),其全局坐标则要加上 rect transform 的 position 值。

还有一个需要注意的是,SetVertices中设置的顶点数目必须是4的倍数,因为 UGUI 的绘制元素是四边形 Quad 而不是三角形。

参考