Unity中使用UGUI修改Mesh绘制几何图形

发表于2017-04-28
评论2 4.8k浏览
  有些场景中会需要使用到几何图形,就拿王者荣耀来说,个人战绩就是使用几何图形来展示的,那在开发过程中是如何实现的呢,这就是本篇文章要介绍的重点,在Unity中使用UGUI修改Mesh绘制几何图形,具体的实现方法有三种,有需要的可以看一看。

  方法一:

  细心的朋友应该会发现,每个UGUI可见元素,都有一个“CanvasRender”组件,就跟3D世界模型有“MeshRender”以及2DSprite有“SpriteRender”一样,UGUI的UI元素也需要一个Render渲染出来,那么第一时间想到的就是修改Render的Mesh。
1
2
3
4
5
6
7
8
9
10
11
12
private CanvasRenderer render;
 
    void Update()
    {
        Mesh mesh = new Mesh();
        mesh.SetVertices();      // 设置顶点,这里缩略没写出顶点数组
        mesh.SetUVs();         // 同上
        mesh.SetTriangles();     
 
        render = GetComponent();
        render.SetMesh(mesh);
    }

  不过不知道为何,这种做法失败了,不知道是哪里出错,待我再研究下。
  本来想直接获取render的mesh,然后在此mesh的基础上修改顶点的,可惜render并没有获取mesh的方法,或许是我还未发现。

  刚刚试了下,又成功了,不过在Start里还是失败,我是放到Update里才成功的。

  还有,获取顶点的方法:
  1.OnPopulateMesh(UI.VertexHelpervh)
  2.Liststream=newList();
  2.vh.GetUIVertexStream(stream);

  方法二:

  然后我想到UGUI是开源的,然后就跑去看源码,研究Image控件的实现原理,发现了Image是继承Graphic,而Graphic里有OnPopulateMesh这个函数,查官方API:
  protectedvoidOnPopulateMesh(UI.VertexHelpervh);
  Description
  CallbackfunctionwhenaUIelementneedstogeneratevertices.
  UsedbyText,Image,andRawImageforexampletogenerateverticesspecifictotheirusecase.

  说的是当该控件(例如Text,Image,RawImage)需要改变顶点的时候,就会自动调用。

  在传入的vh参数里修改顶点,三角形,UV等,同样可以达到修改mesh的目的。

  不过该函数是只有在该Craphic组件需要修改的时候才会调用,比如你修改Image的大小,或者它加载的时候才会。

  这样就导致我们没法及时看到我们对mesh的修改,比如用是将一张Image的四个角分别用四个对象表示,这四个对象的移动,会让这种Image发生形变。但是没法及时更新就没办法了。

  还好有SetNativeSize()这个方法,其实跟刷新差不多。

  上代码:
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
// 自己手动刷新
 
 void Update()
 {
 
  SetNativeSize();
 }
 
protected override void OnPopulateMesh(VertexHelper vh)
    {
        Color32 color32 = color;
        vh.Clear();
     // 这里我用5对GameObject的坐标来与该Image对象的五个顶点绑定起来
     // AddVert的最后一个参数是UV值
 
        vh.AddVert(pos[0].position, color32, new Vector2(0f, 0f));
        vh.AddVert(pos[1].position, color32, new Vector2(0f, 1f));
        vh.AddVert(pos[2].position, color32, new Vector2(1f, 1f));
        vh.AddVert(pos[3].position, color32, new Vector2(1f, 0f));
        vh.AddVert(pos[4].position, color32, new Vector2(0.5f, 0f));
 
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 4);
        vh.AddTriangle(2, 4, 0);
    }

  方法三:

  创建一个组件脚本,这个组件继承BaseMeshEffect,然后在里面覆写ModifyMesh(Meshmesh)方法,在该方法内部实现修改mesh即可。

  作用以及写法几乎与第二点一样,只是不用继承Graphic组件,这样可以实现比较好的扩展性。把效果做成Effect,然后所有Graphic组件都可以通过添加该组件来实现扩展。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引