Unity UI网格自定义应用
引言
Unity UI是Unity官方支持的UI框架,在设计上有一定的灵活性和扩展性。UGUI除了RectTransform, Canvas,CanvasRender稍微底层的组件,主要组件如Image,Text等都是开源的。
UGUI基础结构
UGUI里面所有可以绘制与响应事件的图形组件都继承于Graphic。由于基础组件都支持遮罩层,实际上Image,Text这些并不直接继承Graphic,而是继承MaskableGraphic。在UGUI内部进行Graphic网格生成的时候,会去调用OnPopulateMesh方法。也就是说,当子类需要自定义网格时,只需要重载OnPopulateMesh这个方法就可以了。下面是该方法的声明:
public abstract class Graphic [Obsolete("Use OnPopulateMesh(VertexHelper vh) instead.", false)] protected virtual void OnPopulateMesh(Mesh m){ } protected virtual void OnPopulateMesh(VertexHelper vh) { } }
除了Graphic子类可以自定义网格外,还可以通过IMeshModifier接口来实现。比如一些效果组件Outline, Shadow等,就是通过这种方式实现的。下面是IMeshModifier接口的声明:
public interface IMeshModifier { [Obsolete("use IMeshModifier.ModifyMesh (VertexHelper verts) instead", false)] void ModifyMesh(Mesh mesh); void ModifyMesh(VertexHelper verts); }
可以看出ModifyMesh和OnPopulateMesh非常类似,如出一辙。事实上,UGUI在执行完OnPopulateMesh之后,会检测同一个GameObject上有没有实现了IMeshModifier接口的组件,有的话就会调用ModifyMesh方法的实现。值得注意的是,组件的挂载是有顺序的,也就是当同时有多个IMeshModifier组件时,会按照挂载顺序依次执行ModifyMesh。
事件UI层的处理
在某些情景下,我们需要一个UI层去接受事件,又不需要显示这一层UI。针对这种情况,一种简单的做法是挂载一个空Image,将Alpha设为0。但是这种做法有个缺陷,会造成无用的重复绘制,在一些手机平台上,会产生无用的额外的开销。最好的办法是自定义一个Graphic组件,但又不进行渲染。这可以通过自定义网格来实现,也就是清除网