hud是游戏中大量使用的元素,一个血条往往只需要很少的表现。在Unity中常用的UI大都是nGUI或者uGUI,因为图文层级交错或者Depth重叠,往往带来不少的Drawcall开销,从而导致游戏性能的开销。这里我们建议使用3D mesh的方式去绘制HUD,从而去优化性能。
本文对应的源码已经公开到github,点击地址可以查阅。
绘制血条
我们使用c#代码-Hud.cs动态创建一个mesh。首先动态创建一个mesh,我们画四个三角一共使用八个顶点。设置好他们对于的本地坐标。创建好的mesh如下图所示:
我们将前面两个三角使用顶点色-红色来表示血条, 后面两个三角使用灰色表示满血的情况。
项目中我们内置了两个shader, 都是采样顶点色。不同的是VertxSurfShader使用surface shader实现,会计算光照的颜色,而VertxFragShader直接输出顶点色,不参与光照的计算。相对来说VertxFragShader更省一些。
在VertxSurfShade中我们采样顶点色(appdata_full)来作为vert shader输出的颜色。
在VertxFragShader中采样顶点色的使用如下:
然后设置关联的render组件里关闭反射光线和接收投射阴影。
对应的代码实现如下:
绘制文字
绘制文字也不实用nGUI或者uGui使用的组件,而是使用Unity自带的组件TextMesh。我们把TextMesh挂在Hud组件下面,设置好文字大小和对齐方式。对应的代码实现如下:
控制血条进度
控制血条进度,其实控制的就是顶点1、3、4、6的uv信息。这些顶点的位置在[-x,x] 之间(x=2),我们根据传进来的值在[-2,2]进行差值,算出最终的顶点位置,最后赋值给mesh,来达到控制血条进度的效果。
在Unity中运行HudShow, 在Game视图左上角的GUI-Slider调整进度,我们可以发现对应的血条也跟着发生变化。下面查看Drawcall的信息,运行DCShow,我们创建了大量的hud,并控制不同的血条进度和位置,打开Stats面板,我们看见一共只有四个drawcall,除了摄像机固定的两个drawcall,所有的hud通过合批一共只有2个drawcall。
好了就这样,拜拜!