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

目标

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

环境

  • Unity 2018.1.5f1 Personal (64bit)

方法

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

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);
    }
}

效果:Unity UGUI绘制任意形状的基础——在代码中通过顶点绘制正方形_第1张图片

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 而不是三角形。

参考

  • 在Unity中使用UGUI修改Mesh绘制几何图形 https://www.cnblogs.com/jeason1997/p/5130413.html

  • 在Unity中使用uGUI绘制自定义图形(饼状图 雷达图) https://blog.csdn.net/langresser_king/article/details/46928197
  • Primitive UI https://assetstore.unity.com/packages/tools/gui/primitive-ui-45996
  • Draw 2D Physics Shapes in Unity https://medium.com/@hyperparticle/draw-2d-physics-shapes-in-unity3d-2e0ec634381c
  • UGUI教程之-自定义UGUI 扩展集(三) http://www.unity.5helpyou.com/3500.html
  • UIVertex https://docs.unity3d.com/ScriptReference/UIVertex.html
  • Unity游戏选/创建角色界面中 职业能力图六角形 https://blog.csdn.net/u010019717/article/details/52279010
  • Unity GUI(uGUI)扩展实例:自定义曲线控件 https://blog.csdn.net/zhaoguanghui2012/article/details/54091713
  • Custom Mesh Rendering under UI Canvas https://forum.unity.com/threads/custom-mesh-rendering-under-ui-canvas.265700/
  • https://github.com/geniikw/drawLine

你可能感兴趣的:(Unity)