Unity UI网格自定义应用

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组件,但又不进行渲染。这可以通过自定义网格来实现,也就是清除网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值